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 think @sylvaincorlay implemented widget.show - https://github.com/ipython/ipython/blame/master/IPython/html/static/widgets/js/widget.js#L326 as a part of https://github.com/ipython/ipython/pull/6115 .  Looking at this and that, removing it would break the fix but my implementation also breaks it.

Thinking about it more, I really think the CodeCell-isms, like this.widget_area.show really belong in CodeCell.  I'll think about it some more, but my gut feeling is that a view in IPython is shown in a widget_area by definition, unless child to another view which displays it somewhere else (which is an alternative solution).  Models, which are more powerful now than before, can be instantiated without the widget area being shown.

Regardless of what, we will need a decision before this PR is merged.  As of now, I'm thinking I'll remove the widget.show method.