Shader system overhaul

Shaders are now implemented on a per-material basis, and several
combinations and options can be passed to an individual material (e.g.
normal-mapped, unlit, fresnel etc.) which are combined at load-time from
various glsl code fragments. ShaderManager.cpp controls caching and
handling of shaders and shader programs.

NOTE: Rendering is still not optimized. As of now the old, recursive
method of calling a RenderComponent's render function is used. This
means that for every single material, a call to glUseProgram as well as
settings of all uniforms are performed. An optimized process would be to
sort meshes into groups based on their shader programs, and then have a
single glUseProgram and uniform process per group.