Added a check in the OperationCanceledException to double check if we should close the socket "cleanly"

- OperationCanceledException is called differently on the .NET client
and the server.
- Also found an issue where if we have an error that's thrown that is
not ObjectDisposedException or OperationCanceledException the WebSocket
would remain open.

#1254
Added a unit test to verify that the websocket handler causes an unclean close when throwing an operationcanceledexception

#1254
Merge branch 'release' into dev