Program cache and runKernelCL.

Cache loaded programs and kernels to make composition of initializers
easier.

Adapt runKernelCPS to live in the CL monad to make running OpenCL
kernels fit in with the rest of the CL monadic API.