[IFRT] Support portable PjRtLoadedExecutable
[IFRT] Support portable PjRtLoadedExecutable

This change fixes support for portable `PjRtLoadedExecutable` (an executable
that can be compiled once and dynamically loaded onto any device at execution
time). The previous code had device assignment handling that is not compatible
with `TfrtCpuClient`: `xla::ifrt::PjRtLoadedExecutable` expects some device to
be present in the device assignment, while `xla::PjRtLoadedExecutable` expects
no device to be present. This is resolved by making
`xla::ifrt::PjRtLoadedExecutable` allow empty device assignment.
