Gemini CLI / Antigravity OAuth login could hang indefinitely during Cloud
Code Assist provisioning: pollOperation was an unbounded while(true) loop
with bare fetch calls that never checked OAuthController.signal, passed no
signal to fetch, and had no per-request timeout or attempt cap.
Add a shared oauthFetch helper that composes the controller signal with a
30s per-request timeout, and a throwIfLoginCancelled guard. Thread the
signal through exchangeToken, getUserEmail, discoverProject, onboardUser,
pollOperation, and the Antigravity onboardProjectWithRetries/discoverProject.
Bound pollOperation to 24 attempts; a stall now surfaces OAuthError
(kind:"timeout") and cancellation surfaces LoginCancelledError.
Fixes#4085