Print numeric value as well as stringified GLenum

There's no easy way to tell the difference between a GLenum and uint.
Print both the numeric value and stringified GLenum value if any.
Add GL Shader and Program wrappers

Also modified the wrappers API. Implementation structs now private, use
construction functions instead of static opCall. Most importantly this
allows us to add @disable this(this) to the implementation structs.