This also allows *all* panels to be re-used based on equality, as
originally intended. Beatmap updates should be handled correctly without
a full (flashing) recreation of panels now.
This is a minimal implementation in order to keep moving forward.
For simplicity I've copied over the old implementation verbatim. Note
that this is beatmap*set* based randomisation, which means that when
panels are split up by difficulty, it is still randomising by set (with
the difficulty choice being left up to the user recommendation system).
I think this is what we want, but if it isn't, any changes can come
later.
I only briefly skimmed this code during implementation becuse I assumed
it was doing what was already proven in old song select.
Turns out it was not. And it was iterating and LINQing its way to death
(multiple seconds for <1000 beatmaps).