It's not clear to me that GraphicsContext3D is doing what it can to delete entries from its shader source map (and variable info map) after a shader and it's program are deleted.
<rdar://problem/12416650>
When we call ::glDeleteShader, if the shader is still linked to a program it gets marked for deletion, not immediately destroyed. Do we need to hold onto our shader source entries until the actual shader object is cleaned up by OpenGL? There doesn't seem to be API to be notified when the deletion actually occurs.