Extend the type system with coercion

To allow collections to be treated as boolean values, this commit
introduces the concept of type coercion to the type system.
Add CoercedPredicate to handle type coercion at runtime
Make patterns as expressions be treated as predicates or collections

Patterns used where an expression of any type is expected will return a
collection of the matching paths. When the pattern is used where a
predicate is expected, the pattern expression will instead return true/false.
Remove PatternPredicate

PatternPredicate(...) does the same thing as NonEmpty(PathExpression(...))
For the sake of less code, remove PatternPredicate.
Merge pull request #1331 from systay/pattern-collections

Pattern collections