OpenCL constant memory support

Although the branch is "gpu_constant_memory", it currently only supports OpenCL. The pull request grew larger than I expected, and supporting constant memory in CUDA will be substantially different.

This partially addresses issue #328.
It is possible that the strides mean that this is not enough bytes. E.g. if this is a crop of a larger image. The more correct thing (starting from a Buffer) is something like: elem_size() * (1 + (extent(0) - 1) * stride(0) + (extent(1) - 1) * stride(1) + ...

i.e. the address of the last element minus the address of the first element plus one element.