Description:
Spawning multiple ZMQEnvServer instances in a loop (e.g., orchestrator with 2+ [[env]] entries) intermittently fails:
zmq.error.ZMQError: Address already in use (addr='tcp://127.0.0.1:xxxxx')
Root cause
verifiers/utils/worker_utils.py::get_free_port_pair() closes both sockets before returning (via with), so the OS can reassign the same ephemeral port to the next call before the first ZMQ server has bound it.
Affects both verifiers/envs/environment.py::Environment.start_server() and prime_rl/orchestrator/vf_utils.py::spawn_env_server().
Proposed fix
Hold the reservation sockets open with SO_REUSEADDR until the parent process exits. This prevents the OS from recycling ports while child processes are starting, and SO_REUSEADDR allows ZMQ in the child to bind the same address.