TreehouseDispatchers
One of the trickiest things Treehouse needs to do is balance its two dispatchers:
ui executes dispatched tasks on the platform's UI thread.
zipline executes dispatched tasks on the thread where downloaded code executes.
This class makes it easier to specify invariants on which dispatcher is expected for which work.
Each TreehouseApp gets its own instance of this class and has its own private Zipline thread. All apps share the same UI thread.