Add `ifAbsent` and `optional` and add fields to `Error`.

`Error` contains much more information now, such as the source of an
error (usually the parameter name), the error reason (availability or
type conversion failure) and a set of labels ("query", "header", etc).
This information is used in the new predicate modifiers `ifAbsent` and
`optional` which correspond roughly to `def` and `opt` except being
specific to predicates which use `Error` as their `Fail` metadata and
which do not recover from type conversion failures.