Changed Serializer to use Encoder and Decoder types instead of OutputStream and InputStream.
Added method of encode/decode a long to Encoder and Decoder.
Fleshed out the Encoder and Decoder interfaces to add some primitives and some more test coverage.
Encode the selection reason using a byte rather than a short.
Use the convenience super class for unit testing the serializer implementations.
Added method to encode/decode a binary array (ie data + length)
Changed all the Serializer implementations that were using DataInput or DataOutput to use Encoder and Decoder instead.

- Removed DataStreamBackedSerializer.
- Changed some serializers so that they create less garbage.
- Write a byte instead of short in a few places.
Added methods to encode/decode an int that represents a size (ie likely to be small and positive). The Kryo backed encoder uses a variable length encoding for these values.
Use the encoder to flush to the backing stream, instead of flushing the stream itself, so that the encoder can buffer stuff if it likes.