I too ran your code on my board and it ran for a couple hours without hanging.
Is it possible that there is some noise getting onto the USB line? I'm thinking that if there was some sort of loose connection that the physical act of pushing the button could cause the noise. I would say that the watchdog might work but the restart process takes so long. Maybe if you could use the trick that Nick showed, so you might be able to shortcut the startup process.
Maybe you could commit some of your design to solder. As you can see from my photo, I built a small plug-in board for the USB interface. I may only use it of bread-boarding but it keeps everything in place. Sort of a building block if you will.