Widget Messaging Protocol (IPEP 21)

This implements [IPEP 21: Widget Messaging](https://github.com/ipython/ipython/wiki/IPEP-21:-Widget-Messages).
IPython's UUIDs are a string of 32 hexadecimal digits without the `-`s in them. If we parse them as UUID and save into `id::UUID` then when writing them to a string, we will introduce `-`s. This will cause a mismatch in ID at the front end. I think it's better to just make `id` a string. Does this sound OK?