Abstract ContextID.

It used to be a type synonym. Now it's actual representation is hidden.
Add more Typeable and Enum instances.

I had to make VAO an Ord for this.
Use Uniques from Data.Unique rather than IORefs in Ords.

Ord instances are provided for many resources that work by creating unique
values and using them as the comparing point. I had been using top-level IORefs
for this but let's move to Unique instead (which is internally implemented the
same way).