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.
Rather than disabling the widget, or adding the broken link icon , we could just add a `disconnected` attribute/trait to the base widget model. Then every widget would be responsible to show (or not, and how)  that it is disconnected from the back-end. 

Besides, I don't think that we should set `disabled` to true. The reason is that you may still have some functional link between the slider and some other model on the JavaScript side (using link widgets).