Optimizations for memory-tight systems.
Check all previous gaps first for any usage, so gaps we created when
faced with perhaps a relatively large allocation that left a lot of
the last chunk on the table can be backfilled with smaller things as
it goes on.
Separate the members that only live in the head object out of the
buffer management object, reducing the cost of new chunks. Allocate
the head object members as the first thing in the first chunk, and
adjust all the code to look there for them.