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.
Why not `while(true)`? Pedantic, yes, but it would probably be clearer.