Add a ShaderProgram class

Encapsulates compiling, linking, and managing shader attributes; Also update graphics test program to use ShaderProgram
What I do on the WebGL side is have the program wrapper track the currently bound GL program on a static variable. Then you can have a use() method on the program class, and it can only call glUseProgram() if that program isn't already active. Allows you to call use() more frequently without worrying about introducing extra unnecessary state changes.