[wip] Spawning pool

Time to shave off that final 2-second delay. This PR implements #32 by pre-launching a configured *(by which I mean hardcoded to "3")* set of containers and handing them out to incoming requests. When a container is culled for inactivity, it's scrapped and a new one is launched and added to the pool in its place.

If you hit `orchestrate.py` with a path already set (using a stale link, for example, or an appear.in-style link like #67 implements), you have a personal container created and linked as it happens now.

/cc @rgbkrk so he can see just how terrible this is right now, and suggest embetterment techniques :wink:
> This whole section seems like it should get refactored in a util method that gets handled by the pool so we're not repeating how we invoke create_notebook_server and the other options.

Yeah, excellent :+1:

In general, I think I still have a lot of cleanup to do in terms of functionality that I moved into the SpawnPool, but neglected to remove from its original location. I left the original culling function around, too, for example.