(#22205) Chose a Prioritizer based on Puppet[:ordering]

This ties the selection of the Puppet::Graph::Prioritizer to the
Puppet[:ordering] setting. In order to make it easier to ensure that all
of the uses of the prioritizer use the same one (because it needs to
track state) this also moves around the relationship of the catalog and
the transaction. Previously the catalog was responsible for converting
itself into a relationship graph. This now puts that responsibility on
the transaction, which much now be constructed with the desired
Prioritizer. The selection is still done in the catalog (because that is
where #apply lives, which is the public starting point of applying a
catalog).

Additionally this adds a random prioritizer.
(#22205) Extract common Prioritizer code into a superclass

All of the prioritizers had the same code to track priorities already
produced. This pulls that into a superclass.