Add necessary infrastructure to cache uniforms in just one place. Right now the uniform cache is spread on this code.
Cache the uniforms when glLinkProgram is called.
glUniform1i and glUniform1iv can be used to load sampler types