Change how skip is handled

- Functions that are filtered by grep are now skipped entirely
  (`beforeEach` and `afterEach` are not called)
- Tests may be skipped by calling `this.skip(<reason>)` inside the test.
- Tests that have been skipped are indicated by the presence of a
  non-null `skipped` property. This property has a string value that is
  the reason the test was skipped. It will be set to an empty string if
  not provided when a test is skipped.
- Test#skip now takes a reason string that will be used as the value of
  the `skipped` property on the skipped test as a `skipped` property.
- Test#skip throws an error by default to allow tests to be easily
  skipped. An optional second argument to Test#skip can be set to true
  to supress this error.