Widget persistence API

Instead of persisting widgets ourselves, this PR provides the tools to allow users to persist widget states however they want.

This PR also includes some bugfixes, one of which is the removal of views on cell re-execution!!!
Based on #6664 

- [x] Try it
- [x] Include examples

@ellisonbg @SylvainCorlay @jasongrout 
With this change, maybe we don't need the `Widget.show` method in widget.js?  Also, is there a way to have the widget rendered without showing the widget area (for example, suppose the widget is actually displaying itself elsewhere on the page).