Add dependencies.
Add uniform_hash require to pass.

Forgot to include it.
Add missing call to glGenerateMipmap in GT::Texture#initialize

If you were really proud of a white texture being white because of this,
I'm sorry.
If no names are given, only bind uniforms the program knows about.

No reason to bind others. This does mean that you _must_ hint that a
uniform exists now, but that shouldn't be a big deal.
Add a check to avoid binding a uniform that isn't set.

This is also handled inside bind_uniform (if the value is nil), but this
at least skips a function call and makes it more explicit that unset
uniforms don't get bound.
Add Material, Pass, Program, and their builders.

Material is a very simple class: it's basically just a dumb object with
an array of Pass objects. You call per_pass on it with a block and it
executes that block for each pass, including that pass's pre- and
post-pass blocks.

Pass manages a small amount of GL state and otherwise does not a whole
lot. It binds uniforms using the currently set UniformHash instance,
it sets some GL state, sets up texture units, and so on. It's not a
complex class, but it was tedious to write.

Program is just a small wrapper around Gl::Program that handles uniform
aliases and provides a builder. It's not much more.

The builder classes all just let you do an instance_exec on them after
initializing them with an object for their respective parent class. They
just simplify building materials, passes, and programs. Originally, I
was going to do an actual DSL and load materials from the same .def
format as used in Snow, but decided this was probably not worth doing.
So, instead, you get builder classes.