Fix shader error handling under PyOpenGL.

Existing Pyglet handling code remains.
PyOpenGL throws an exception (and continues to
do so if any other functions are called).
We can get the information from the exception
instead of querying the glGetShaderInfoLog function.
Throw an exception (OpenGL.error.GLError) instead of
returning a Boolean.
Ensure correct value count is passed to Uniforms.

When setting a uniform, we now check the number
of values against the expected number.
Add access to uniform dtype and data_size.
Add comments regarding the Uniform type dicts.
Move vertex attribute functions to buffer.

The VAO only remembers this information, but it is
actually a property of the buffer.
In GL Legacy, these functions exist even though there
are no VAOs.
Add enable / disable for vertex/color/normal/etc.
Change cube renderer to use shaders / buffers.

This now demonstrates how to render using PyGLy's
TypedBuffer in GL Legacy using Shaders (#version 120).