update nbconvert to nbformat 4
strip transient values to/from nb files

orig_nbformat isn’t part of the file format
add nbformat.output_from_msg

for creating the appropriate NotebookNode from
an output message on the IOPub channel.
minor adjustments to js test event waiting

- avoid ReferenceErrors on IPython
- avoid empty string for notebook_url in save.js (yay, async!)
preserve orig_nbformat when converting 3 to 4

preserves orig_nbformat = 2 in 2->3->4
update html/js to nbformat 4
update IPython.core to nbformat 4

affects `%run` and `%notebook`

removes `%notebook --format` conversion, that's what nbconvert is for.
add `nbformat.writes(version=X)` for downgrade

allows easy downgrade of notebooks.
support downgrading notebooks with nbconvert

Use:

    ipython nbconvert --to notebook --nbformat 3 notebook.ipynb

to write `notebook.v3.ipynb`

Adds `output_suffix` resource, inserted before file ext.
Suffix is used if `--output` is not specified.

Default is `.nbconvert`, to prevent `--to notebook` from clobbering existing notebooks by default.
add nbformat spec to sphinx
s/prompt_number/execution_count in nbformat 4
add assert_big_text_equal

for better output when large strings differ
trust is stored in code_cell.metadata

not top-level code_cell
msgspec: stream.data -> stream.text
move mime-bundle data to rich output.data

from top-level output keys
only rich display outputs have metadata

even affects v3, which had some bugs that didn't describe actual js behavior
semicolons, you guys!
output[mime/type] -> output.data[mime/type] in javascript
update nbformat spec in sphinx
warn on invalid notebooks before/after conversion

was raising on downgrade, warning on upgrade