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.
The duration is actually recorded in [nano seconds](https://github.com/cucumber/cucumber-ruby-core/blob/master/lib/cucumber/core/test/timer.rb#L13) so `#nanoseconds` could be the method name. As a side note, the [gherkin_formatter_adapter](https://github.com/cucumber/cucumber/blob/master/lib/cucumber/formatter/gherkin_formatter_adapter.rb#L143) converts the duration to seconds, and then the [gherkin::json_formatter](https://github.com/cucumber/gherkin/blob/master/lib/gherkin/formatter/json_formatter.rb#L69) converts it back to nanoseconds.

If we look at the duration object API as `#nanoseconds` is only allowed to be called inside a `#tap` block, than throwing an error is reasonable.
If we look at `#nanoseconds` as a regular method of the API, then also UnkownDuration should return something reasonable for it. 0 is kind of the most neutral integer value (would it have been a float, then `Float::NAN` could be used). Returning self is possible, if UnkownDuration also use some other tricks from http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/, so it responds reasonable "nullish" to the methods that could be sent to an integer:
```
  def method_missing(*args, &block)
    self
  end

  def to_a; []; end
  def to_s; ""; end
  def to_f; 0.0; end
  def to_i; 0; end
```