Support use of bindFragDataLocation.

To map fragment shader outputs, we accept a user supplied IO function
that is given the program value before linking the program. This lets
the user map fragment shader outputs to color buffers.
Added support for loading geometry shaders.

Geometry shaders are not supported by the OpenGL package as nicely as
Vertex and Fragment shaders. The hiding of definitions in the package
makes shoe-horning such support in rather awkward, with the need to
duplicate a fair amount of code.