1e5b507440
Follow-up hardening on top of the salvaged #80809 watchdog, porting the locked state-machine design from #75301 (credit: @Zeraphim): - All lifecycle transitions (stale/cancelled/done) now happen under request_client_lock. A user or monitor interrupt marks the request 'cancelled' so a racing stale timer can no longer misclassify the kill as provider staleness and feed a false +1 into the #58962 cross-turn circuit breaker. - 'done' is set under the lock on completion, so a late timer callback that lost the race to a successful response is inert instead of leaving a spurious streak=1 behind the reset. - Registration race closed: if the budget expires while the client is still being constructed, _make_client aborts the freshly-registered client and fails the call with a retryable TimeoutError instead of opening a brand-new socket after the only watchdog already fired. - _resolve_direct_stale_timeout now fails closed: a raising resolver propagates (same as the worker path) instead of being swallowed into an infinite budget that would silently disarm the watchdog and reinstate the very hang #80759 is about. 4 new regression tests, each verified to fail against the pre-fix watchdog implementation. Co-authored-by: Zeraphim <diamantejc87@gmail.com>