Make VirtualObjectCache more generic
Rather than require every implementation of a DeviceAdapter to implement their own version of VirtualObjectCache, make a generic version that leverages the already existing ArrayManagerExecution to transfer data to the device.
These changes implicitly require the ArrayManagerExecution to provide an ArrayPortal for the execution environment that returns a reference from the Get method (so long as the ArrayPortal for the control environment does the same thing). So far this has been straightforward to implement.