Generalise Nondeterminism gather to use Reducers

Previously we were reducing to a `List` - `aggregateCommutative` would
then `foldMap` the `List` to a final result. We should be able to skip
the generation of the intermediate list, if that's not what we want.