The callbacks are scheduled to the API thread, but hooked up in BDL
load. This causes a potential case of cross-thread collection
enumeration.
I've tested and it seems like the schedule logic should be fine for
short term. Longer term, we probably want to re-think how this works so
background operations aren't performed on the `DrawableChannel` in the
first place (chat shouldn't have an overhead like this when not
visible).
Closes#11231.
In the non-pooled case, `OnNewDrawableHitObject()` will be called
automatically on each new DHO via `Playfield.Add(DrawableHitObject)`.
In the pooled case, it will be called via `Playfield`'s implementation
of `GetPooledDrawableRepresentation(HitObject, DrawableHitObject)`.