RespectMe - respecting disconnect token in store WebSocketTransport

The store WebSocketTransport did not respect the disconnect token. Now if the disconnect cancellation token is cancelled we will not try to reconnect if the websocket gets closed and if we are already trying to reconnect we will stop doing this. Note that we don't need to register to the cancellation event since the disconnect cancellation token is cancelled only in the `Connection.Disconnect()` method which also disposes the transport which will take care of the all needed clean up.

Also fixed a race in the WebSocketTransport.Dispose method which might lead to unwanted reconnection attempts.

Workitem #3189
Doomed - prevent from sending a message when reconnecting

Previously the store `WebSocketTransport` would accept `Send` requests when the transport was reconnecting. The change to invoke `OnError()` and throw an exception if this happens - similarly to what we do in the .NET Client.
Detect slow callbacks in .NET client receive queue and trigger an error

Since we serialize the invocations of Received callbacks in the .NET client,
there is a real risk of deadlocks resulting from one callback blocking waiting
on another callback to execute.

This commit introduces a TaskQueueMonitor used exclusively by the .NET client
to try to detect callbacks that are running long and notify the user using
Connection.OnError that a callback may be deadlocked.

The amount of time a callback may execute before an error is raised can be
configured using Connection.DeadlockErrorTimeout. The default timeout is
10 seconds.

#3167