Bit level parsers and combinators
Bit parsing is handled by tweaking the input in most macros.
In byte level parsing, the input is generally a
&[u8] passed from combinator
to combinator until the slices are manipulated.
Bit parsers take a
(&[u8], usize) as input. The first part of the tuple is an byte slice,
the second part is a bit offset in the first byte of the slice.
By passing a pair like this, we can leverage most of the combinators, and avoid transforming the whole slice to a vector of booleans. This should make it easy to see a byte slice as a bit stream, and parse code points of arbitrary bit length.