Add reduce_on_gpu() algorithm

This adds a improved reduce() algorithm implementation for
GPUs. Also adds checks to accumulate() which allow it to
use the higher-performance reduce() algorithm if possible.
Add cache support to meta_kernel::compile()

This updates the meta_kernel::compile() method to support
caching of program objects. The programs are cached based
on a hash of their source code.