Use multiboot info to determine memory limits

mem_init() now reads the multiboot_info structure to grab free memory
from below 1MB and determine the amount of memory available in high
memory.

Macros and inline functions are added to multiboot.h to make this more
readable.  In particular, iterating over the memory map is a total mess
otherwise.

Additionally, the kernel prints some information about the memory layout
during boot in a pretty format.