Zone Contention Rule Ifc
Chooses which of the transporters waiting for a zone gets it when it comes free.
This decision changes the course of a run: two transporters waiting at a junction will finish their journeys in a different order depending on which goes first, and everything downstream of that follows. It is therefore made by a named, replaceable rule over an ordered list, never by whatever order a collection happened to iterate in. A model whose outcome depended on iteration order would give different answers on different platforms, which would cost it the reproducibility everything else here is built to preserve.
A rule must choose from the transporters it is given, and must be a pure function of them. One that needs randomness must draw it from a stream the model controls.
Choosing is not optional. A waiting transporter has nothing scheduled, so it moves again only when something hands it the zone. Declining to choose would therefore not leave the zone free and everyone waiting until next time -- there is no next time, because nothing holds the zone and so nothing will ever release it again. Everyone waiting would wait for the rest of the replication, and the run would simply stop advancing with nothing to say why. The return type says so: a rule is asked only when there is at least one transporter to choose from, and it must name one.