I've made it so that `Graphics.update` pauses the Ruby VM and returns to the libretro frontend. Once the libretro frontend calls `retro_run()` again, the Ruby VM resumes. This allows the libretro frontend to control the rendering loop.
I know I've got a long road ahead of me. I'm committing my work so far for future reference and so that I can check for CI failures.