fix SIGABRT in TP/EP tests by forcing gc.collect() after destroy_process_group
The SIGABRT was a timing race during interpreter shutdown: gloo's
pt_gloo_runloop threads were still alive when Python's finalizer called
the C++ ProcessGroup destructor (because the Python ProcessGroup object
was being GC'd at interpreter exit rather than immediately).
Root cause identified via the diagnostic branch (0f562ff2): adding
extensive file I/O after destroy_process_group() caused 6 consecutive
CI runs to pass, confirming the bug is purely a latency race between
gloo thread teardown and interpreter shutdown.
The minimal fix is gc.collect() immediately after destroy_process_group()
so the C++ destructor fires while the process is still in a clean state,
not during interpreter finalization.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>