add version key to js message headers
add shim for double-serialized JSON

msgspec gives unserialized JSON,
nbformat v3 wants JSON strings.
add IPython.kernel.adapter

for adapting msg spec versions
begin testing msg spec adapter
further adapter tests, and associated fixes
adapt messages in Session

adds Session.adapt_version for target version.

- serialize adapts to Session.adapt_version (default: 0, no adaptation)
- unserialize always adapts to current active version
interrogate kernel_info to get protocol version for adaptation
update message spec adapter per review

- docs and comments
- adapt complete_reply with `end=null`, `start=-len(matched_text)`
- remove some incorrect `status` fields
- add `handle_reply_status_error` for handling `status=error` replies (no-op, currently)