Refactor: Push schema index/constraint conflict messages down the stack to align with SPI.

Proper messages for these exceptions can only be created within the context of the operation
and below the SPI level so that such users (Cypher) enjoy increased friendliness.
`Reason` is the wrong name for what you'd wish to achieve, the type of the exception already communicates the reason, what you want is a context i.e. what was the user trying to do when it failed because the constraint already existed.

Modelling that as an enum could be ok, or possibly we could allow the user-exception to add the context to the message, since that knows the context. So what we'd do then is to still use the `getUserMessage( new StatementTokenNameLookup( statement.readOperations() ) )`, but prepend to that message what operation the user was trying to perform when this failed.