`ExecutorScheduler` uses `SleepingAction` to schedule delayed execution using `Thread.sleep`. Agree that it might be inefficient, but it's a tricky one to implement with pure `Executor` interface. We can think about performance optimisations here.

But I think that `ScheduledExecutorServiceScheduler` would be a great choice to use in practice in most cases since `ScheduledExecutorService` supports both delayed and immediate execution.