Custom uniform search optimization

- Switched ProgramState from unordered_map(string, Uniform) to unordered_map(GLint, Uniform) for faster uniform search. This will give opportunity to access uniforms in program state by their location that gives faster search speed than using strings.