ISPN-3807 Cache the result of HQL query parser to be reused

Use a local cache with expiring entries to store the result of the HQL parsing and reuse it
if same query is executed.
ISPN-4670 Matcher performance test
ISPN-4670 Matcher refactoring

Relocating some responsibility among classes to simplify their collaboration.
ISPN-4670 Replace Iterator of AttributeNode.children with array for faster iteration
ISPN-4670 Do not unsubscribe if executing in a single filter context

The cost of maintaining a map of unsubscribed predicates if high and it can only be amortised if there are many
filters (continuous query scenario). For the single query scenario we prefer not to maintain it at the cost of
having to deal with potential duplicate notification.
ISPN-4670 Use an array to store the FilterEvalContexts instead of a HashMap

The HashMap lookup was a heavy hot spot.
ISPN-4670 Avoid double lookup in known types hashmap
ISPN-4670 Replace map of unordered predicates with list
ISPN-4670 No longer keep track of suspended PredicateNodes in MatcherEvalContext

Keeping just the unsubscribed Predicates is enough. Eventual duplicate notifications are easily avoided.
ISPN-4670 Move isRepeated flag from PredicateNode to Predicate

This is the first step to simplify and optimize subscriptions
ISPN-4670 Move PredicateIndex.PredicateSubscriptions to Predicates.Subscription
ISPN-4670 Remove unused return type of BENode.handleChildValue
ISPN-4670 Only repeated predicates really need to be unsusbscribed
ISPN-4670 Refactor Predicate/Predicates to not use IntervalTrees for the single-filter scenario

* Usage of IntervalTrees is beneficial only when we have many predicates, like in the continuous query use case but it slows things down in the single-filter scenario.