Starting point for the new MMIO interface

Design doc:
    https://docs.google.com/document/d/11qcGCWLne1wYvmtFaSrOKZt_vHxXrcWcZsdWJ-MJnyo/edit

The code is currently not used. Migration plan:
    1. Implement MMIO access via MMIO::Mapping in parallel to the current
       method.
    2. Implement all existing MMIO handlers via the new interface.
    3. Remove the old hwRead/hwReadWii/hwReadIOBridge code.
    4. Implement JIT optimizations for MMIO accesses.
Fix a debug assert statement
MMIO: Rename Direct -> Direct{Read,Write}

The overload was previously selected based on the constness of the pointer
passed to Direct. Since most pointers that will be passed are not const, we
can't automatically choose the overload here.
MMIO: Make Invalid handler messages more explicit
MMIO: Fix an issue in the UniqueID computation formula
MMIO: Divide the UniqueID by the access size when registering a handler
MMIO: Add utility functions to grab pointers to low/high parts of a u32 variable
MMIO: Provide a way to register read and write handlers separately.
MMIO: Register ProcessorInterface MMIOs via the new interface
MMIO: Register VideoInterface MMIOs via the new interface
MMIO: Register MemoryInterface MMIOs via the new interface (and rework that module extensively)
MMIO: Add a NOP write handler type
MMIO: Make invalid handlers a simple specialization of the complex type
MMIO: Pass the read address to read/write handlers and forward it to the complex handlers.
MMIO: Rename Complex to Complex{Read,Write} because MSVC and old GCC are too stupid to figure out overloads
MMIO: Port the DSP/ARAM/AI MMIOs to the new interface.
MMIO: Port the DI MMIOs to the new interface.
MMIO: Port the SI MMIOs to the new interface.
MMIO: Port the AI MMIOs to the new interface.
MMIO: Port the IPC MMIOs to the new interface (untested).