Revamped resizable arrays

This patch makes some major changes to the resizable array implementation.  The new implementation is API-compatible with previous versions, but not ABI-compatible.  All code that uses resizable arrays will need to be recompiled.

We no longer reserve space in the array itself for a small number of elements; the element storage is now always allocated from the heap.  The `cork_array` type now contains a `priv` pointer, which lets us maintain API compatibility with previous versions — in which you allocate a `cork_array` instance yourself, while still being able to maintain ABI compatibility moving forward.  (This ensures that the public `cork_array` type is of fixed size, even if we add new features; any extra fields needed for those new features will be placed into the opaque struct that the `priv` field points to.)

More interestingly, you can now provide a handful of callback functions, which let you automatically initialize and finalize array entries as they're used and discarded.  You can provide separate initialization callbacks for when an entry is used for the first time, or reused.  Similarly, you can provide separate finalization callbacks for when an element is removed without freeing its underlying storage, and for when the array element is freed.