IPEP 21:  widget messages

[IPEP 21](https://github.com/ipython/ipython/wiki/IPEP-21:-Widget-Messages) has full description of the proposal.

This is just the basic communication tube, through which widgets might communicate.

It's pretty basic, but it seems to work reasonably well.

Some example use cases for the Comms implemented here: http://nbviewer.ipython.org/6547109

This also refactors callbacks in a clearer way, allowing callback cleanup since widget messages dramatically exacerbate #2524.

closes #2524.