This uses one 2d canvas per window and a managed offscreen
WebGL canvas to render to. Some day it may/should be possible
to render to different canvases using the same WebGL context
but as that's not currently possible this is one solution

Note that it appears to be slow on Windows but not OSX / Linux.