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
- [x] Include tests

@ellisonbg @SylvainCorlay @jasongrout 
From Gitter:
>  Poor communication, sorry.
>  I meant
>  That callbacks "that you register" are automatically called when necessary.
>  With that API, all you have to do is write methods with the signatures load_state() as state dictionary and save_state(state dictionary).
It automatically get_state and set_states for you along with the notebook's save/load.
Alternatively you can get_state and set_state on the widget manager itself, if you want to control when loading/saving happens.