CompositorThread kept per-context compositor state, scrollbar handling,
async scroll reconciliation, and cross-thread scheduling in one large
ThreadData implementation. That made it hard to tell which code was
plain state transition logic and which code owned locking and wakeups.
Move the per-context state transitions into CompositorContextState while
leaving ThreadData in charge of the command queue, mutexes, condition
variable, main-thread invocation, and cross-context present selection.