The start/end case feels like a bad legacy decision we had to deal with. Like you said, here its not a xhr, its a different pattern.

For this "unmount" use case you still need to run your unmount function on popstate as well. I feel like we should just pass in the `contents` in both places so the arguments are consistent. Skip raw access to `data`.