add a comment to aid my understanding of the code
tweak image loading code; no functional change

use different variables to hold the size of the program header table and
the section header table, in preparation for upcoming changes.
keep the program header table for longer

change where free() is called on the program header table when loading
the kernel. keep it around for a bit longer, since it will be needed by
upcoming changes.
locate and load the ramdisk segment when booting

when booting, locate the ramdisk segment and load it in at the very end
of the kernel, after symbols, on a page-aligned boundary, setting
MARK_RAMDISK accordingly.