Consistently report conflict resolution This commit refactors how conflict resolution selection reasons are handled, in order to:
- collect the list of versions which participated in conflict resolution - report a single conflict resolution cause when conflicts are resolved several times for the same module - consistently report module replacement rules as rules, not conflict resolution. Before this change, a module replacement was reported as both a conflict and a rule
Build the component selection reason when required We were building the component selection reason incrementally, as a `ComponentState` was chosen for a `SelectorState`. This meant that reasons could have ended up on evicted nodes, and were missing from the actual selected node.
Instead, we now build the reason for a component based on the set of selectors that were involved in choosing that component, even if those selectors were upgraded through conflict resolution.