Add a web socket call concept for connecting.

Similar to HTTP and Call, the WebSocketCall is a representation of a pending HTTP request and subsequent upgrade to speak web sockets. Upon synchronous execution you are handed a WebSocket instance for synchronous writing and also pass in a WebSocketListener for async callbacks due to reading.

The API changes in this commits also generalize WebSocket such that it's agnostic to being a client or server peer.

Closes #1173.

Missing tests:

 * [ ] Non-101 response
 * [ ] Response with failed web socket upgrade (multiple)
This could be removed by dependency-injecting the pong `Executor` but I simply cannot justify it since the usage is so simple.