Widget Messaging Protocol (IPEP 21)

This implements [IPEP 21: Widget Messaging](https://github.com/ipython/ipython/wiki/IPEP-21:-Widget-Messages).
I can understand why the `target` might be a type parameter, but why isn't `id` just a field?  Since the `id` is just a random number (uuid), I don't understand how you could dispatch on it.