Simple widget persistence

Widgets are persisted to a `widgets` key in the notebook json and `widgets` key in the cell json for now.  Works with page refresh and kernel restart.  Widgets are disabled when the comm connection is lost.  Persistence also works with nbconvert html output.  When the page is refreshed, the Widgets attempt to reconnect to their counterparts in the back-end.

The default nbconvert html output dumps the necessary JS file into the same folder as the output:
`nbc notebook.ipynb --to html`

To embed the necessary Javascript into your nbconvert output (no extra files):
`nbc notebook.ipynb --to html --InlineHTMLPreprocessor.inline_js=True`

Enabling these behaviors in nbconvert requires the developers to install r.js via npm and fun `fab js` in the `html` directory whenever changes are made to the widget framework.
Yeah, sounds good to me.