Idiomatic Go implementation

I've taken the liberty to create an idiomatic Go implementation of this WebSocket wrapper, primarily for my own uses. As such, I felt it was appropriate to share the implementation.

WebSocket now implements `io.Writer` and most calls are blocking. I began to implement the `io.Reader` interface, but decided that the refactor needed for buffering would be more appropriate for a separate implementation.
Implementation details thoughts.

I think it might be simpler to use one channel for all websocket-related events, including open/close/error and receive. Or at least use `openCh` for everything other than receive events.

I think that would allow fixing the hack below with the potential panic when closing `openCh` since it can be done in two paths.

But this is an implementation detail and can be fixed later.