123b9aa961
roundtrip set no connection deadline and call checked the context once, before sending, so a daemon that read the frame and stopped answering parked the caller for as long as the socket stayed open. The deadline comes from the caller's context, falling back to 120s, the convention internal/voice/client.go already had. A watchdog closes the conn on ctx.Done(); it closes rather than calling drop, because drop wants c.mu and call is holding it. The retry split is unchanged and now also declines a retry the caller has stopped waiting for. A cancelled mutation stays ErrAmbiguousOutcome, because it may have committed. A cancelled read reports the cancellation. Three tests against a server that accepts and never answers. There was no test for this, which is why it went unnoticed.