Handles allocating `Iobuf.t` and making sure there's enough space in it.

`val get_header_chunk : unit ‑> (Core.read, _) Core.Iobuf.t`
`val ensure_free : int ‑> unit`

All of these will push the current chunk into the list of previous chunks first; a new chunk will then be allocated on the next write.

`val is_empty : unit ‑> bool`

Is the main (short message) buffer empty?

`val get_chunks : unit ‑> (Core.read_write, Core.Iobuf.no_seek) Core.Iobuf.t list`
`module Unsafe_internals : sig ... end`

To aid producing test cases for Reader.