MODE-2364 Changed the way the Infinspan listener approach is used when dealing with user transactions:

Instead of multiple listeners (which doesn't really scale), this approach uses 1 listener instance to handle all the different threads (transactions) and leverages the fact that we're using a `ThreadLocal` to store the active ModeShape transaction. Therefore, when notified, the listener should be able to tell if it's being notified for the tx associated with the current thread or not.
As commented on the JIRA issue, I think it's mandatory we call the functions from the ISPN thread. The reason is that if something fails, we want to revert the entire flow (I would hope ISPN can do that if it notices an exception) or we would be leaving the workspace caches in an inconsistent fashion compared to the main ISPN cache.