Reduce allocations by removing client message classes

Previously, sending a message to the backend involved instantiating a class, and calling its WriteToStream() method; the instance would then be thrown away. This caused needless instantiations for a great deal of messages, and made the workflow more complicated than it needed to be.

Moved the actual wire-writing code to NpgsqlConnector, reduced the allocations happening along the flow.