event interface refactoring and test cleanups

- more DRY for stream/file events
- less static test variables, more static methods
- test threads use a Callable instead of extending Thread
- test threads are checked for test failures / exceptions
- test threads run in an executor (cached thread pool)