Before this change, it was possible to access a `const CollectiveParams&` after
it was destroyed. For example, the call to `UnblockDependencies` in
`NcclCommunicator::Enqueue` raced with the done_callback of the collective
participant.
This change makes `CollectiveParams` a refcounted object, and holds references
everywhere it may be accessed.
PiperOrigin-RevId: 355646163
Change-Id: I7fd164afe8c1c9aa1c3b77a988930a0624977c7c