Tidy up rendering logic considerably

Now the interpreter calculates the frame data. It's up to execute targets to
figure out how to map that to an actual device. Could still use some cleanup
but a lot better already!

Closes #18.