Romfs archive

Added file system support for the RomFS archive, and various other changes/refactors in support of loading the RomFS. Also includes interface code for the File System service, with implementations for the OpenFileDirectly and (archive) Read service functions.
This doesn't guarantee safe handling for invalid (i.e. ridiculously large) section sizes. Suggesting change to

    std::unique_ptr<u8*> temp_buffer;
    try {
        temp_buffer.reset(new u8[exefs_header.section[i].size]);
    } catch (std::bad_alloc& ba) {
        return ResultStatus::ErrorInvalidSizeOrOutOfMemory; // feel free to pick a better name
    }

Background is that I *actually* wanted to complain about how this could simply use stack allocation instead of heap allocation by using `u8 temp_buffer[exefs_header.section[i].size]`. However, then I realized that invalid exefs headers would lead to a stack overflow and/or crash the emulator. But without exception handling, heap allocation isn't really any better.