push & pop correcly before & after calling isr_handler. This way an exception can be handled and doesn't result in a #GPF
Loading elf files almost there

next steps:
1. make memory management and paging work to see if this actually works
2. jump to ELF_LOADADDR and execute
3. rename parse_elf to exec
4. user mode
removing a few compiler warnings and unused lines of code
Memory management improvements. This commit contains dragons.

the linked list now works a little bit better. There's no gaps, UNINITs or merges. Some functionality is lost, but it the remaining works better

kmalloc is now intertwined with paging, which might be a bad idea. Here's how it goes:

1. kmalloc asks the linked list for first-fit item
2. kmalloc maps the virtual address range from #1 with physical frames from PMM
3. kmalloc sets protection and paging present bit

Steps 2 and 3 are not well designed. Page faults can't be handled correctly, and adding new page tables is a nightmare. An easy solution would be to allocate the whole 4gb virtual address space at boot, and then use the page fault handler to map virtual to physical. This is not practical, so dynamic pte allocation would be nice.