A safety net behind the cursor fix rather than the fix itself: with pagination
working a normal wallet finishes in a couple of requests. But a genuinely long
history, or a provider answering slowly, would still get the job killed at 120s —
and because `last_synced_at` is only written on success, that leaves every cycle
restarting the same first sync, which is the state this connection was in.
The deadline is the caller's, passed in, for two reasons. Wise creates one account
per currency per profile, so a budget per wallet would multiply straight past the
job's timeout — a three-wallet connection reproduced the original bug verbatim.
And a caller under no time pressure (`banking:sync --sync` runs in-process, where
the worker timeout does not apply) can pass null and walk as far as it likes.
`WiseClient` now sets its own 15s/5s timeouts instead of inheriting the
framework's 30s, so "the budget plus one in-flight request" is a bound this code
actually owns. Matches EnableBankingProvider and InteractiveBrokersClient, which
were the only two setting theirs.
Stopping short is now a warning, not an info line: pages left behind are history
the user silently does not get. `importPage` is extracted to keep `sync` under the
complexity threshold, which the deadline had pushed it over.