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.
Can this method be more efficient by using the same `FRONT_MASK` and `BACK_MASK` as RAIS to allow output in chunks of bits instead of bit-by-bit?