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.

Jira: https://issues.jboss.org/browse/ISPN-3807
Did you consider assigning the cache field to a local variable and return it instead?

```
Cache result = cache;
// Do double checked locking
return result;
```
According to [1], perf gain can be 25%, wonder if this still holds for modern JVMs

[1] Effective Java 2nd Edition Page 284