Initial web socket API.

This PR is to a `websocket` feature branch for later merging into `master`.
Still unclear. We have a few options for sure but I won't know exactly where we stand until things are a bit more hooked up.

We might require consuming or calling `.close()`. Or if you don't consume in the callback we might consume the rest for you.