Reimplement reduction functors (SUM, MIN, MAX)

The new implementation uses same dual functors as in sort/scan
algorithms.
Use object_cache to cache Reductor work buffers

This should save device memory when many instances of vex::Reductor
are created at different points in program. It will also fix #119