New, faster, more modular, even simpler async implementation

Thread pools (called routes) always maintain consistent state. State
changes occur only through Route.adapt, which compares-and-swaps a
single state pointer. A state change can affect multiple parameters;
for example, rousing an idle route will simultaneously activate all
waiting threads, and start any required new threads. Worker threads
(called tracks) maintain locally mutable state with eventually
consistent (to the route's state) semantics.

The PrimeAsync components do not have interdependencies, so other Async
implementations can selectively use them.