I have tried to make the in-process kernel manager API-compatible with the standard kernel manager. Under ideal circumstances, they should be drop-in replacements for each other. Certain methods, like ``signal_kernel``, do not make sense for the in-process kernel manager and therefore raise exceptions; similarly, certain attributes, like the ZMQ context, are not present on the in-process channel objects. Apart from this, the interfaces should be identical, including for the channel classes. Ultimately, I would like to see both kernel managers inherit from some abstract base class to clarify which subset of the interface is guaranteed to be common.

Sharing implementation was not useful for the kernel managers, though I did share implementation as appropriate in the blocking and Qt channel classes.