Create a protocol instance per connection.

Some protocol such as Compact require state which means that
each reader and writer need a new instance. This required changing
the interface for Protocol. A protocol looks more like an
Encoder/Decoder now.

Bufio is now used when FramedReadWriter isn't (since in that
case it's already buffered).