ShaderProgram Class

also cleaned up some more stuff and made shader file reading more
efficient (i think)