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.
Ahh I missed this one, this is in the nbconvert output.  `disabled` bit has already been removed from the live notebook and replaced with the unlinked property we talked about.  Thanks for point this one out too, it's still on my TODO to remove (once I get around to fixing the nbconvert output).