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
I don't think there is an actual bug here, even though this is potentially dangerous.

The only product code that uses this (i.e. uses the ctor that sets a non-null _maxSize) is ScaleoutStream, and it does [check if the Task returned by Enqueue is null](https://github.com/SignalR/SignalR/blob/2.1.2/src/Microsoft.AspNet.SignalR.Core/Messaging/ScaleoutStream.cs#L111).