migrating to a higher-half kernel.

paging is enabled before calling `main()`. the current setup
uses 4MB pages in order to easily map the entire first 4MB of memory
to 0xC0000000 (3GB). This obviously maps all hardware memory mappings
and the kernel itself (until the kernel is > 3MB).
updating paging after configuring memory.

Switching to 4KB pages and mapping 16MB for kernel code,
kernel heap, and all pages allocated by kernel.