Improve exception handling

This pull request:

 - tidies up and renames the existing exceptions, and ensure that there are no generic `Exception` or `RuntimeException`s being thrown
 - traps and futurifies exceptions thrown from transactAsync
 - helps extract information from Clojure’s IExceptionInfo exceptions
 - flattens out the exception chain that occurs for query processing exceptions