Disclaimer: I have a patch in Linux, but I don't know anything about this section of code at all, I only know what I've heard. I will try to explain it as I understand it from a high level though; just take it with a grain of salt as for how accurate it is.
As I'm sure you're aware, the resume process has to do everything in a precise order because some subsystems rely on others to be awake before they can proceed. Every driver has to interact with less traversed paths of code and they have to work on sometimes obscure hardware where the documentation doesn't exist or is wrong (think reverse engineered drivers), and every piece has to work more or less flawlessly or the rest of the chain can't load.
As I understand it, the state of the machine is written out to page file and has to be loaded back from there and then run as if nothing had happened. Consider just the case of software that doesn't behave correctly when the system time jumps ahead a couple of hours mid computation. I've had issues with KDE not being able to wake up from screen saver (maybe USB didn't reinitialize correctly and it can't see my mouse/keyboard inputs?) or the screen not coming back without power cycling my monitor after thawing out the state.
There's a lot that can go wrong, and it seems it usually does. I know even Windows sometimes has issues when I close my laptop and head into the office - sometimes it remains running the entire time (I think VirtualBox is the cause - but I can't reliably reproduce, so I'm not sure).