Implement optional memory space support for PjRt stream executor and use it to add memory space support to GPU
Implement optional memory space support for PjRt stream executor and use it to add memory space support to GPU

This CL implements an optional interface that allows PjRt stream executor implementations to add basic memory space support. The simplest form is one memory space per device, which requires just a memory space implementation and nothing else (memory space variants of transfer methods fall back to the corresponding device versions if the memory space is associated with just one device). More sophisticated mapping is possible, but requires overriding methods that take a memory space as a destination.

Using the above, this CL also adds basic memory space support for SE:GPU. Right now, there's just one memory kind, HBM (`StreamExecutorGpuHbmMemorySpace`), and every PjRt GPU device has a corresponding HBM memory space as its default memory space. While this does not bring any new feature, it simplifies the framework and runtime support since the caller does no longer need to check whether the underlying implementation supports memory space or not.
