array: another approach (untested)

This design splits the array into two layers. The lower layer is the
"array", which is storage for a fixed number of elements of fixed size.
The length of an array never changes.

Atop this we build the "buffer", which is storage for a fixed maximum
number of elements of a fixed size.  The buffer's length can vary,
but must never exceed the capacity (length) of the underlying array.

The buffer uses the "buffer gap" technique to allow amortised constant
time insertion and deletion at any position in the buffer provided that
insertions and deletions exhibit locality.

This is almost certainly overengineered for what I intend to do with
it. It's also not yet tested, so it's probably full of off-by-one
errors.