* Cache the enabled vertex attributes in `Context`
* The vertex attribute parameters (offset, stride, ...) are not cached,
yet
* Store parameters as `VertexAttribParams` in `Program`
Each Texture is bound to a unique texture unit (glBindTexture is called
only once). Context keeps track of the current active texture unit and
reduces the number of glActiveTexture calls to a minimum.
Program, Buffer, Texture... structs no longer store a reference to a
Context. Now it has to be passed explicitly to all methods that mutate
the OpenGL state. This enables caching the state and removing redundant
calls to gl* functions.