A user initiates a $100 withdrawal. Midway through, the payment gateway times out. Money left our account but the app shows "failed." How would you design the system to handle this? Be specific about idempotency, reconciliation, and user communication.