01 cleans up the serializer snafu we've been living with
02 actually does the optimization
Prior to this patch we had three generic serializers:
ICompactSerializer, which is used by Messages, and whose de/serialize methods have version parameters
ICompactSerializer2, which does not have versions and whose methods have DataInput/Output parameters instead of Input/OutputStreams. (The former is a superset of the later.)
ICompactSerializer3, which extends ICS2 and adds serializedSize.
To do this optimization I'd need ICS4, since I want serializedSize AND versioning.
Instead, I've replaced the three old interfaces with just ISerializer and IVersionedSerializer. Both use DataInput/Output, and both have a serializedSize method; the difference is that the former does not have a version parameter. Implementers that don't care about precomputing size simply implement as UnsupportedOperation.
A few serializers (in LegacyBloomFilter and MerkleTree) still needed a Stream parameter because they are doing JDK serialization under the hood. None of that code actually cares about using a generic Serializer interface, so I just made them one-off classes and everything was happy.