Idle callbacks are only appropriate when the event loop has no other
runnable work. TaskQueue previously stored idle tasks in the same FIFO
list as all other tasks, so an idle callback queued during an idle
period could still run ahead of later posted-message work.
Keep idle tasks in a separate queue and only select from it after all
normal runnable tasks have been considered. This keeps cleanup queued
with requestIdleCallback from racing React hydration on Shopify.
In `::spin_processing_tasks_with_source_until()`, we would first take a
set of tasks based on a filter, and then run them one by one. If there
was more than one task matched and put in that vector, they could
interfere with each other's runnability by making later tasks
permanently unrunnable.
The `::take_tasks_matching()` API is a footgun - remove it in favor of
an API that takes tasks one by one, performing the runnability check
just in time.
Resulting in a massive rename across almost everywhere! Alongside the
namespace change, we now have the following names:
* JS::NonnullGCPtr -> GC::Ref
* JS::GCPtr -> GC::Ptr
* JS::HeapFunction -> GC::Function
* JS::CellImpl -> GC::Cell
* JS::Handle -> GC::Root