Add a Transfer object for ArrayHandleVirtual
Previously, ArrayHandleVirtual was using the default Transfer object. This was problematic because it would copy/allocate things in the execution environment independently from the array that it was wrapped around. This caused several negative effects, particularly for CUDA devices. First, if the data were already on the device (or the array is implicit), a second copy of the data would be made. Second, the copy to the device is likely less efficient. Third (and worst of all), the data did not always get pulled back to the original array correctly. This commit also contains instantiations of ArrayHandleVirtual and its components for the most common types.
Showing with 286 additions and 12 deletions