Move Spritesheet onto VertexBuffer.

We now use G_ARB_draw_elements_base_vertex extension, so that
instead of having to create tons of index buffers (one per tile),
we just use the default one {0, 1, 3, 2}, then to use the correct
vertices in the VBO for that tile, we use the base_vertex parameter
of the glDrawElementsBaseVertex, so that the indices are offset to
n + base_vertex.
Enable the cache key to be templated.
Cache shaders.

We use a std::pair of the filenames as keys, for that we needed a
std::hash specialization (and the boost::hash_combine).
Provide a generic load method for the Cache class.
Move rendering into Sprite.
Move rendering into Spritesheet.

Now Texture only serves as a texture container, the way it should
be. Sprite and Spritesheet should be mergedMove rendering into Spritesheet.

Now Texture only serves as a texture container, the way it should
be. Sprite and Spritesheet should be merged..
Merge remote-tracking branch 'origin/ice-dev'

Conflicts:
	src/font.cxx
use VAO's to manage the state (only need to bind everything once)
refactor the Input.hold* code
fix typo in Input
auto detect image channels.

JPG and other RGB images were broken because we forced RGBA.
Draft of a new event-based GUI system.

Implements a windowskin and mousedown/mouseup/click boilerplate.
enable dragging, trigger mousemove events

TODO: mousemove should be triggered on all GUI objects, nevertheless,
because if we drag too fast, we get out of the window area, and
the dragging stops.

note: I think the click event on area is triggering twice, need
to fix that.
Implement double clicking, fix duplicate event bug.
implement Window#uptime, reset double click distance after :dblclick

glfwGetTime() is probably the fastest time function, giving us
a bit of a speed boost.
merge Widget/Container rewrites.

warning: breaks other scripts.
Added MusicActivityHud#z, a position exposure

It was a long overdue thing to be done.
#x, #y, and #z have all been exposed and can be modified
to move the Hud around.
auto register widgets
inital work on a Button class.

To get any further, we need to implement writing to textures and
pixel operations. We'd make a Sprite.new, then we'd be able to
copy pixels in and out, or write them manually. This way, we'd just
make a new empty sprite, then draw the button out via code and
render it. Text rendering would benefit the same way: render text
once to an image, then simply render it over and over again.
Merge branch 'master' of https://github.com/archSeer/moon into ice-dev