Implement contiguous memory allocation and deallocation

This patch supplements the existing placement address algorithm for
memory allocation with a dynamic memory allocation and deallocation
system. Some of the implemented features include:

    1) The heap is defined as a data structure which can be created at
       run time, allowing for multiple different heaps.

    2) Heaps can expand and contract at run-time as necessary.

    3) Heaps contain an index of blocks, sorted by size.

    4) Block allocation occurs on a first fit basis.

    5) A block is book-ended by a header and a footer.

    6) A block can be either active or not (a hole).

    7) Freeing a block changes its status to a hole. On doing so, the
       heap will scan the blocks immediately to the left and right to
       see if they are holes as well. If so, the holes will be
       merged. This prevents fragmentation over time.

Based off of James Molloy's kernel development tutorial, available here:
    http://www.jamesmolloy.co.uk/tutorial_html/7.-The%20Heap.html

Addresses issue #5: Add a memory manager
ordered-array: Implement destructor
ordered-array: Use kcreate over kmalloc
Remove stray file