Optimizations; fix to allow Pict3D canvases AND snips in one program

Sphere and light fragment shaders are a little more fill-rate friendly.
Still have some work to do: would like to use only mat4x3s for affine
transforms (i.e. view and model matrices).

Moved model matrix from uniforms to vertex attributes. The intended
way to use Pict3Ds is by transforming basic shapes. Each model matrix
change in a scene restarted vertex streaming, which induced more
expensive API calls, which limited the number of unique model matrices
in a scene to about 200 per frame (at 60FPS). The new way transfers
the affine model matrix to each vertex shader using 3 vec4s. Vertex
shaders compute inverses if needed; most send both matrices on to the
fragment shader in "flat out" variables. A bit wasteful of bandwidth,
but the results are good: 6000 unique model matrices per frame.
Freezing a scene to make it into a single shape is still helpful (e.g.
50000 spheres and 500 lights at 60FPS), though less so in some
circumstances.

Fix: VAOs can't be shared between GL contexts, which was making it
possible to use `pict3d-canvas%` or `pict3d%` (the snip) but not both.
(Each canvas gets its own context; all snips use the "master"
context.) Fixed by keying cached VAOs used for streaming on context.

Smaller fix for nonexistent problem: guarded creating the "master"
context with a semaphore, just in case.