I can see this being difficult in general if there is interaction with stateful hardware, e.g. graphics card or USB device, the state of these would need to be saved by the OS. And for the scenario of moving application memory images around, you would also need the state of any hardware that application had open, and it might need to be able to cope with e.g. a different GPU on the target machine (perhaps irrelevant atm where haiku has no GPU acceleration).
Also, in terms of your two differing approaches, you could combine them - provide a callback (virtual function in c++ I guess) that will be called just before the memory imaging happens, and allowing the default memory snapshotting to be be exchanged for something simpler if the application wants.
If you could make this work at application granularity, you would even be able to e.g. move an application between screens (from laptop to desktop perhaps) when using multiple machines on one desk with linked keyboard/mouse (using usynergy)… amazing!
Another thought… security implications might be quite significant.
EDIT: of course I should have expected that Linux already has this functionality https://www.criu.org/