The OpenCL system for open heterogenous data parallel supercomputing.
**General Notes on the differences between Haskell and the OpenCL-C implementation**
* Side-effectful procedures capable of returning an error code only return a Maybe ErrorCode, with Nothing returned upon success
* Procedures which follow the pattern of returning a pointer to an object and taking a final parameter as an error code instead return Either ErrorCode ObjectType
* Procedures which prefix with clGetInfo* merely take the object, parameter name, and parameter size to allocate. The allocation handled by OpenCLRaw and returned as a Haskell-managed ForeignPtr ()
* Enumerations and constants are replaced by newtypes for the sake of type-safety.