Improve reduce() performance

This makes a few tweaks to the reduce() algorithm in order to
improve performance. An unnecessary barrier() has been removed
and now multiple values are reduced on the initial read.
Add command_queue::enqueue_migrate_memory_objects() method

This adds an enqueue_migrate_memory_objects() method to the
command_queue class which allows memory objects to be migrated
between compute devices and to the host.
Add event::get_command_type() method

This adds a get_command_type() method to the event class
which returns the OpenCL type for an event object.
Change enqueue_*_buffer() methods to return events

This changes the enqueue_copy_buffer() and enqueue_fill_buffer()
methods in the command_queue class to return event objects.
Change meta_kernel::exec*() methods to return events

This changes the exec() and exec_1d() methods in the meta_kernel
class to return event objects.
Add support for on-device copy_async()

This adds support for copy_async() when copying between
memory objects on a compute device.
Add test for copy() command type

This adds a test to ensure that the copy() algorithm uses
the proper command type when copying memory buffers.
Add fill_async() algorithm

This adds a fill_async() which fills a range with a
given value asynchronously.
Add test for fill() command type

This adds a test to ensure the fill() algorithm uses the
clEnqueueFillBuffer() function if supported.