Make comm manager (mostly) independent of InteractiveShell

This makes it possible to use comms from wrapper kernels, without
instantiating the full IPython shell machinery.

The one remaining place where we need a reference to shell is to fire
pre_execute and post_execute hooks (which are needed to get mpl figures
right). This is a pure IPythonism, that it should be safe to ignore if
shell is not set.
Make comm_manager a property of kernel, not shell
Safeguard against comm instantiation with both session and kernel (corner case)
Merge pull request #6540 from takluyver/comms-mgr-needs-no-shell

Make comm manager (mostly) independent of InteractiveShell