Implement physical memory allocator.

More specifically:
  * Have the linker save us some space for the memory catalog.
  * Read the memory map that the Multiboot bootloader gives us.
  * Build a list of free pages (i.e., pages that are usable, but that are not already used by the kernel image).
  * Make functions for allocating and freeing pages.

Note that this pull request does not know anything about page tables or virtual memory.  It just happens to track physical memory in 4kB blocks.