type Runner interface {
Run(func() error)
Wait() error}
Runner wraps the lifecycle methods of a new task set.
Run will block until a worker is available or the context is cancelled,
and then run the given func in a new goroutine.
Wait will wait for all the running goroutines to finish.