Fix GPU/HW synchronization

Due to Citra being an HLE emulator, hardware synchronization is inherently inaccurate. Previously, Citra was not able to synchronize the GPU effectively for both homebrew (libctru) and retail applications. These changes are a result of my testing of many applications (both homebrew and not) and finding the current best-case balance of simulated timing. This PR significantly improves compatibility at this time, however these changes will likely evolve as we better understand GPU/synchronization.
> This assumes that the active frame in memory is always complete to render.
Isn't that a safe assumption? The expectation is that you would use double-buffering to avoid tearing.