simple_websocket's receive(timeout=1) returns None when no frame arrives in
time; it does NOT mean the connection closed. The recv_loop treated None as a
disconnect, so any client that pauses sending for >1s (i.e. any silence longer
than one second, or a mic that only transmits while speaking) permanently
stopped the session from hearing the user -- barge-in and the next turn both
went dead while generation kept streaming out.
Also default --device to MPS when CUDA is unavailable, so CPU-only Mac paths
stop falling back to cpu.