Closes https://github.com/ppy/osu/issues/33877.
Most likely regressed when the user tags were changed such that the
loading spinner that shows on adding/removing a vote was introdiced to
every individual tag separately. This in turn means that the
`LoadingLayer` responsible for showing the spinner also briefly consumes
all input when visible, which also means that the control briefly
becomes unhovered, breaking the logic.
This probably doesn't work on mobile because mobile input sucks. On iOS
simulator it looks somewhat fine in that the tags don't move until you
touch the screen anywhere else which seems okay if that's what actually
what happens on device as well. And if it isn't I'm not sure I can do
anything sane about it anyway.
This change pulls back a significant degree of overspecialisation and
rigidity in the class structure of `HitWindows` to make subsequent
changes to hit windows, whose purpose is to improve replay playback
accuracy, possible to do cleanly.
Notably:
- `HitWindows` is full abstract now. In a few use cases, and as a
reference for ruleset implementors, `DefaultHitWindows` is provided as
a separate class instead.
This fixes the weirdness wherein `HitWindows` always declared 6 fields
for result types but some of them would never be set to a non-zero
value or read.
- `HitWindow.GetRanges()` is deleted because it is overspecialised and
prevents being able to adjust hitwindows by ±0.5ms cleanly which will
be required later.
The fallout of this is that the assertion that used `GetRanges()` in
the `HitWindows` ctor must use something else now, and the closest
thing to it was `GetAllAvailableWindows()`, which didn't return
the miss window - so I made it return the miss window and fixed the
one consumer that didn't want it (bar hit error meter) to skip it.
- Diff also contains some clean-up around `DifficultyRange` to unify
handling of it.
For package-managed solutions that set `OSU_EXTERNAL_UPDATE_STREAM`
(which overrides the config value), we should not allow the user to
change the release stream themselves.