Improve the loader a bit

Clean up the loader to open the file only once and pass the IOFile around to functions requiring it, and add a real file detection function based on its magic.
:warning: Introduces a bug. `((u8*)base) + offset` vs. `(u8*)(base + offset)`.