Updated Synchronization Code

Changed all looper.wait() to lock.getCondition().await(), added finally
blocks to ensure that locks are properly released.
Changed the clocks to use ExecutorServices, which allows for better performance.

I also changed your new TimerClock, I hope you do not mind much. Note
that now we do not need to manually implement delays, just use
ses.scheduleAtFixedRate(Runnable task, long initialDelay, long
interval, TimeUnit timeUnit) to create "clocks" for use. For more
questions, just ask me.