Task Supervisor with max_restart and max_seconds

I like option 3 here:

But with the part of handling a failure, I would put in a sleep

# Unexpected failure
  def handle_info({:DOWN, ref, :process, _pid, _reason}, %{ref: ref} = state) do
    :timer.sleep(3000)
    # restart the task
    task = do_start_task()
    {:noreply, %{state | ref: task.ref}}
  end