Buffer: Reduce primitives to byte-at-a-time

Now the only buffer primitives are allocate, peekBits8, and appendBits8,
and the rest are implemented on top. The hope is that a compiler with
good enough low-level optimizations will be able to see multiple
consecutive reads and writes and optimize them into single operations. I
tried to help this along by buiding the C implementation on top of
static inline functions defined in the header (which could be avoided if
we compiled with LTO).

Next step is to write a benchmark comparing this with the implementation
with multiple primitives, ideally on both the llvm and c backends. If
performance is significantly worse, we'll have to evaluate the tradeoff
between simplicity of implementation and performance.