Watchdog timer not being called in sleep mode
Found the solution.
_doSleep was getting called from within the INT0 interrupt, which meant that during the sleep period, it was effectively inside an interrupt. And therefore the watchdog interrupt could not fire. Changed it to set a flag in the INT0 interrupt and then actually go to sleep in the main loop.