Refactor `Puller` to use `TaskRunner`