runner: use a queue to process operations