* Old routers were not being shutdown and removed.
* We were incorrectly associating the new kernel with the notebook
(we were using the *old* kernel_id for this).
* General clean ups in the kernel manager.
* The KernelManager now manages multiple kernels with a uniform
API.
* The SessionManager now manages the full set of channels+streams
and the IPython.zmq.session.Session object for a single kernel.
Previously, each client (browser window) would open its own set
of ZMQ sockets to a kernel. Now one master set of connections
to the kernel is created and all clients share those connections.
In some ways, this simplifies the URL design.
I have also made kernel_ids server-side created.