checkAvailable
Guards any operation that needs the protocol stream to itself.
A connection can carry exactly one exchange at a time. Anything interleaved into a transfer or a result being read would consume the other's messages and desynchronize the connection, so this fails fast instead. Note that lock cannot catch this on its own - it is reentrant, so the very thread that owns the exchange passes straight through it, and that is precisely the thread a callback runs on.