added a periodic worker

The periodic worker will call a function periodically based on an input duration
time.Tick is wrong here - it creates a new Ticker which is never destroyed,
which could become a serious memory leak

You want to use time.Timer. Something like this, perhaps?

    t := time.NewTimer(0)
    w := &periodicWorker{}
    go func() {
        defer w.tomb.Done()
        for {
            if err := doWork(w.tomb.Dying());  err != nil {
                 w.tomb.Kill(err)
                 return
            }
            t.Reset(sleepDuration)
            select {
            case <-t.C:
            case <-w.tomb.Dying()
                return
            }
       }