Refactoring WebSocketConnection

* More correctly handling closing behavior to handle edge cases that aren't exposed through testing with the Autobahn test suite.
* Using per-connection buffering debugger to be able to more easily trace the order of operations when investiating a problem.  (Only active when setting DEBUG environment variable)
* Drastically simplifying the fair distribution of message events emitted amongst connections.  Prevents a lot of data coming in all at once on a single connection from totally monopolizing the server's time before moving on to handling I/O on other sockets, rather than looping through and consuming all the buffered data for a single connection in one shot.
* Eliminating the outgoing frame queue which served no purpose except to create a useless, redundant extra buffer for outbound data.  Having that unnecessarily increased complexity, added undefined behavior around some edge cases, and didn't offer any benefit whatsoever.  There was some uncertainty regarding whether frames queued up to be sent would be discarded if the connection was closed.
Adding reasonCode, description params to close()