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 
I created a new notebook with a box with two sliders.  I then went to the console and did
```javascript
a=IPython.notebook.kernel.widget_manager.get_state()
a
```
and I get a rejected promise with error TypeError: Cannot read property 'notebook' of undefined.  I turned on "Pause on uncaught exceptions", and found that the above `this` refers to the global context, and should be `that`.