66d100a9e9
One SemaphoreSlim serialised reads, writes, subscribes, acks and the whole recursive discovery browse, so a stalled write (up to the operation timeout) blocked every read and subscription create, and a discovery browse would block the data plane for its full duration. Reads/acks keep the read gate; writes and DiscoverAsync are ungated (the SDK session is safe for concurrent service calls, the host bounds write concurrency); subscription management takes its own gate. Dispose drains both (DisposeAsync's drain no longer over-releases on a timed-out wait). Refs #743 Claude-Session: https://claude.ai/code/session_01Ub9hGmYLQvn9XETzw7CMsT