two races hit by real UI use:
- a job-triggered replace nulled the resident generator while state stayed
'ready', so a concurrent job with the old config grabbed None and died on
generate_video. every slot transition (preload / job replace / unload) now
runs under one load lock; jobs block behind in-flight loads instead of
peeking at half-replaced state.
- ray placement-group removal is async: a load right after a release raced
the teardown and failed 'no GPU available'. executor shutdown now waits
(<=30s) for the PG to actually reach REMOVED.