Pulled synchronous pipe methods and truncate methods from ChannelAwareOutputBuffer to OutputBuffer.  The only thing left in ChannelAwareOutputBuffer was the async pipe, so renamed it to AsyncOutputBuffer.
This let me change the signatures of most methods that took ChannelAwareOutputBuffer to just take an OutputBuffer.
Changed OutputBuffer pipeAndClose methods to just pipe.
Changed AsyncOutputBuffer pipeAndClose methods to just pipe.
Changed Connection.sendMessage and AsyncConnection.sendMessage to take a LIst<ByteBuf> as the message instead of an OutputBuffer.
This puts the responsibility on the caller to close the buffers, whereas it used to be the connection's responsibility.
Re-worked the interaction between sessions and operations.  Operation implementations no longer depend on Session.
Instead the Operation interface defines a generic execute method, and there is a new execute method on Session that takes an Operation and executes it.
Additionally, ServerSelectionSession.execute takes a ServerSelectingOperation, which additionally informs the session of its ServerSelector.
Lastly, it defines an isQuery method so that a session can distinguish between queries and other types of operation, in order to be able to implement a
session that pins queries to a particular server.