easy optimisations

* caches shader uniform locations
* applies matrices to shader only upon matrix change operations, not upon every draw call

Signed-off-by: tgfrerer <tim@poniesandlight.co.uk>