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 @brasmusson I think it would be a bit weird to yield the value, would it violate the POLS not to get the actual object?

`#tap_value` is ok... but how about we give the value a good name? Is it recorded in milli seconds?

Then you could do:

```ruby
duration.tap { |duration| formatter.add_duration duration.mill_secs * 10 ** 9 }
```

(Incidentally, should the duration deal with time conversions?)

@brasmusson I think that UnkownDuration should implement the same interface as a duration, but perhaps rather than return 0, it could return itself?