Re-structured ShaderProgram to not immediately use the shader once it's created. More documentation