Until now, the only usage of ruleset layers was where there is both a
ruleset specific and non-ruleset-specific layer present. The matching
code was making assumptions about this.
As I tried to add a new playfield layer which breaks this assumption,
non-ruleset-specifc components were not being displayed in the toolbox.
This turned out to be due to a `target` of `null` being provided due to
the weird `getTarget` matching (that happened to *just* do what we
wanted previously due to the equals implementation, but only because
there was a container without the ruleset present in the available
targets).
I've changed this to be a more appropriate lookup method, where the
target for dependency sourcing is provided separately from the ruleset
filter.
Was causing there to be two kinds of missing `TournamentBeatmap`s: one
with missing `Beatmap == null`, and one with `Beatmap == new
APIBeatmap()`. In particular, they would appear differently in UI
(either as "unknown - unknown", or the intensely enigmatic " - ").
As it turns out, the tightening of hitcircle lifetimes in editor caused
the test to fail, since the objects were too far apart and at the
starting time of the test, the first object was fully faded out and as
such not alive, therefore leading cyclic selection to fail to select it.
To fix, bring all three objects closer together time-wise so that this
does not happen and the test can continue to exercise its original
behaviour.
Because nobody else should need to do anything as cursed as what
`ScheduleScreen` was doing (which is 95% of the reason why the selection
box even broke there).