ReusableByteArrayInputStream lets you change a BAIS's buffer.

It also exposes internal members, because we're all grown-ups.
Revamp BytesType, add #encodeBytes & #decodeBytes.

These methods use `Data(In|Out)putStream` and
`ByteArray(In|Out)putStream` instead of `ByteBuffer`.
Revamp IntegerType adding #encodeI(8|16|32|64) & #decodeI(8|16|32|64).
Add ByteTupleType #encodeByteTuple and #decodeByteTuple.
Add ConstantType #encodeConstant and #decodeConstant.
Add BooleanType #encodeBool and #decodeBool.
Add RawType #encodeRaw and #decodeRaw.
Add FloatingPointType #encodeF(32|64) and #decodeF(32|64)
Revamped BytesType to use looping instead of lots of magic constants.

When encoding and decoding short strings, there are fast paths being used to avoid these.
Also added another size level. (~2 gigs)
Promote encode/decode methods to Type interface.

AbstractType provides default impls throwing
UnsupportedOperationException.
Jiggle names, coalesce encode decode signatures.

The askari type names are no longer embedded in method sigs, instead
the equivalent java types are.  Now the details of encoding (say) a
byte sequence are hidden by the implementing type.
Prove AbstractType throws UnsupportedOperationException for all.
FloatingPointType checks its width and throws Unsupported on mismatch.
IntegerType checks its width and throws Unsupported on mismatch.
NamedType delegates encode and decode methods.
Add PackedType#getTypeIterator, a delegating circular iterator.

This way we can (fairly) painlessly encode and decode entire packed
instances piece-meal.