Fold semantic checking over collection

Rather than using the fold to build a chain of semantic check functions.
This reduces the stack requirements for semantic checking.
Merge pull request #1765 from cleishm/semantic_check_optimization

Fold semantic checking over collections
Recognise multi-word keywords with extra whitespace

ie. "IS  NULL" or "IS\nNULL"
Use internal rather than scala-based heirarchy for types

Introduces static vals for types, prefixed by CT (Cypher Type)

Reverses the directionality of the heirarchy: now treats Any as
the super type ("up" in the heirarchy). This aligns with the
definition in most other languages.

Renames iteratedType on AnyType to legacyIteratedType
(uses innerType on CollectionType)
Replace TypeSet with Type Specifications

These are capable of representing infinite sets of types,
provide better clarity and simplicity in the type checking,
and resolves a number of inconsistencies that could occur.
Add coercion of Cypher Types
Correct type checking of functions