timeout: enforce a time limit on a step

Any step can have a hard time limit enforced by attaching timeout and the number of seconds to limit it to.

The amount of time to limit the step's execution to, e.g. 30m for 30 minutes.

When exceeded, the step will be interrupted, with the same semantics as aborting the build (except the build will be failed, not aborted, to distinguish between human intervention and timeouts being inforced).

The following will run the task, and cancel it if it takes longer than 1 hour and 30 minutes:

- get: foo
- task: unit
  file: foo/unit.yml
  timeout: 1h30m