Added application event handler

User can provides a EventHandler that handles application event. Currently the only application event is a launch timeout event, which means when a runnable took too long to start (mainly due to lack of container in YARN, or starting of runnable keeps failing).

In this PR, it also includes a workaround when provisioning new containers from YARN, so that it won't over provision containers and release it later.