Introduce a Duration object

The main purpose of using a pull request for this change is to have one entry point for the discussions leading up to it: https://github.com/cucumber/cucumber/commit/c6535ce8dd20f43dbc9e26081a08f7d48afadcc6#commitcomment-7953669, and on the first commit on this branch, see below.

Detailed description:
Introduce a Duration object in Cucumber::Core::Test::Result

For results which do not have an actual duration (skipped, undefined and pending) instead hold an null object. Client can either use the "null duration" (0), or check if it is an actual duration or an null duration.
@mattwynne @tooky As `#tap` passes the object into the block, what would be the idiomatic way to get the duration value out of it? `#to_i`?
```
duration.tap { |duration| formatter.add_duration duration.to_i * 10 ** 9 }
```
And should the null object UnkownDuration define the same method at all, for instance returning 0? (UnkownDuration need to define a `#tap` method not executing the block, of course)