got rid of timedwait and now workers sleep until the end

this meant:
* worker condition and mutex are now freed by the dispatcher thread
* always lock when checking a job->func for NULL
  + this works because when a thread signals the dispatcher (sem_post), it's a couple of instructions away from releasing its job lock ; if for some stupid reason its time slice runs out before it can release the lock, the dispatcher blocks on the lock call, which means work will be done by other threads (common case, you'll probably be running many tasks anyway) and then it will come back to the initial worker which releases the lock and the dispatcher can then safely assign new work
  + so the only point when this wastes time pointlessly is when there's only one active job, which is common only when you're just about to exit the dispatcher anyway ; again, since you're using threads you probably have a lot of processing to do and the max 20ms lost are more than likely insignificant in the grand scheme of things
* updated test/test_interactive_launcher.sh to send an extra SIGINT right before terminating the dispatcher
  + this is either an interesting insight into signal handling and pthreads...
  + ...or a corner case my dispatcher isn't handling elegantly. Either way, since (apparently, in most test runs (because threading is non-deterministic)) the STOP signal seems to take precedence over the NEWTASK signal in the EXIT scenario, I don't necessarily see this as a problem

This took a while to debug it into shape without using any silly timed-waits or non-suspending waits or other such non-elegant solutions.

I really like it when threads that do nothing suspend themselves :D