Reduce calls to glGetUniformLocation by caching the results

It uses a new class, GLShader, and some cool new methods