Let unchecked exceptions thrown in a Runnable kill the app do not just eat them.

Also, do not hold the lock on runnables across invocation of the callbacks. 
Its fine to add more runnables while the executed runnables list is
being run through.

Add a test case too.