a simple Effect monad helping to deal with async events