0.  Access data structures with accessor macros, then turn the heapinfo
into several arrays for faster access on machines with addressing modes.
Also, this eventually raises the possibility of maintaining multiple
heaps.
1.  Possible heuristic to catch multiple frees.  Introduce an extra word
of heapinfo that says whether the remaining info is for something
busy or something free.  Then we can catch attempts to free already-free
large blocks, as well as things not belonging to malloc at all.  In the
case of a fragment, we can check if the fragment looks like it *already*
belongs to the fragment list, by comparing it with the "first" fragment
of the block, or checking its "prev" pointer to see if it points into
the block.  Then if it looks like it might we can exhaustively search
the block's free list to see if the fragment is there or not.  Extending
the heapinfo structure would have the benefit of making it a power of
two and thus making array indexing faster, perhaps.  Suitably adapted,
this heuristic could also catch invalid pointers passed to realloc.

All of these additional features require the inclusion of <malloc.h>.
3.  indirect reference allocator: ialloc(), ifree(), irealloc().
4.  garbage collecting allocator: galloc(), garbage(), gfree(), grealloc().
