fix timer and deadlock issues

using signals is just plain wrong because a signal handler
can get invoked after any instruction, e.g. in the middle of a free
call, leaving bad state in the allocator. if anything in the code
run by the timer causes a new allocation that will break horribly.

a thread is no real option either, because all game state is held in
global variables.

the only sane thing to do is to make "sleepIdle" do the timer code
in a synchronous fashion.