Cleaned up virtual memory & physical memory setup

In the process of thinking about mapping the kernel to 0xC0000000
instead of 0x00000000, I found a lot of flaws and bugs in the way
I was setting up virtual memory. This commit cleans up a lot of
that code. The kernel now reservers the entire address space from
0 to 1 GB and the user gets the rest.

TODO: The "bootstrap page tables" in x86/bootstrap_vm.c aren't
really bootstrap-only tables. Since we want to re-use kernel
page tables across all processes, it makes sense to leave them
statically allocated (we will never try to kfree them). So instead
of being "bootstrap" page tables, they are "kernel-only" page
tables.
  - Note that the bootstrap page directory is really bootstrap
    only and should be replaced by a dynamically allocated page
    directory when creating the first process.
  - Also this limits the kernel's virtual address size becuase
    the kernel's page tables cannot contain ANY user pages. Thus
    the start of the user's address space must be on a page
    table memory boundary. With the current setup this is OK.
      Proof:
             0x40000000 / PAGE_SIZE / NUM_PAGES_IN_PAGE_TABLE
              = 0x40000000 / 4096 / 1024
              = 0x100
            Since it divides evenly, we are on a page table
            boundary.