Properly implement`PjRtStreamExecutorBuffer::CopyRawToHostFuture` for PjRt GPU
Properly implement`PjRtStreamExecutorBuffer::CopyRawToHostFuture` for PjRt GPU

The current implementation of `CopyRawToHostFuture` does not implement the exact promised semantics because it does not acquire the buffer hold inline. So if one enqueues `CopyRawToHostFuture` and immediately deletes the source PjRt buffer, this will cause use-after-free in the current implementation even though it is not supposed to be.

This CL changes the `PjRtStreamExecutorClient` to take a future of the host buffer destination, instead of an eager pointer, and updates both the eager and the future versions to use this new method. The implementation always acquires a usage hold inline before enqueueing transfers to avoid the use-after-free problem mentioned above.

`StreamExecutorGpuClientTest.CopyRawToHostFuture` has been updated to exercise the case where the buffer is immediately dropped after the transfer is enqueued.
