Add bit-level operations to RandomAccess{Input, Output}Stream

See https://trac.openmicroscopy.org.uk/ome/ticket/12139.  This implements bit writing in RandomAccessOutputStream and bit reading in RandomAccessInputStream, and deprecates the BitBuffer and BitWriter classes in loci.formats.codec.

What this doesn't address is treating the entire input or output stream as a stream of bits.  So if the following is called on a RandomAccessInputStream containing ```0x2a84```:

```
in.readBits(2);
in.readByte();
```
the return values would be 0 and 0x2a, respectively - not 0 and 0xaa.  So all non-bit methods keep the behavior of reading the next n bytes *from the byte pointer*, not the next n * 8 bits from the bit pointer.  The same applies to writing bits/bytes in sequence.

I'm not thoroughly convinced that we need that functionality currently, and adding it without a performance impact on the common case of working with just bytes is likely to be tricky.  Happy to discuss though.
Not specifically related to this method, but I don't see an implicit flush of currentByte if dirtyByte is set when any other write methods are called.  We don't want to interleave the bitstream with other writes, so I think this needs adding for safety.