Added ShaderProgram object and made some minor refactorings to Shader Object.

ShaderProgram represents an OpenGL Shader Program Object. The implementation caches the program parameters after the call to ShaderProgram::link. The first call to retrieve a program parameter it will interact directly with OpenGL, however succeeding calls will access the cache.