evented IO loop