Seriously nitpicking here, but I think the _logic_ behind `isEmpty()` is flawed. We leave the actual implementation of `isEmpty()` to the concrete class for obvious reasons but the next tick queue should be considered as part of what makes an event loop _empty_ or not, which is not the case (and currently concrete classes have no access to the next tick queue).

That's one reason why I don't like much the strictness an abstract class enforces upon us.