Improve boot status printing code

Use macros instead of kprintf_clr(BOOT_CLR,...).  Print total vs.
available memory.
Read ELF section headers to get kernel position

mem_init() is now significantly more complicated.  It reads information
about reserved memory areas from both the multiboot memory map and the
ELF section headers (also provided by the bootloader), aligns and
coalesces these areas, and finally constructs the free list around the
holes it discoved.  It also saves the ELF section headers in kernel
memory for later use.

If the bootloader reports that it couldn't retrieve the info needed for
this, mem_init() falls back on linker hacks.  In the worst case, the
kernel will assume that the memory from &uend (linker variable) up to
4MB is valid.
Declare keycode tables const

These tables should go in the .rodata section so they can enjoy (future)
page-level protections appropriate for that section.