Serializing the user's session state to LocalStorage comes to mind as a reasonable solution. Comes with it's own caveats, of course (you now have a state versioning problem), but addresses all the points you bring up pretty adequately:
1. As long as their on the same device/browser, they lose zero data. This is a pretty reliable happy-path use case.
2. The only onslaught you'll deal with is simple pageviews since everything in the trial is stored client side, which also makes #3 no problem.