InvalidationInterceptor
-----------------------

Ref: http://jira.jboss.com/jira/browse/JBCACHE-307
Forum: http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3903158

This interceptor pertains to invalidating (evicting) nodes from remote caches upon modification rather
than replicating nodes.

Here is what I have in mind so far with regards to implementing this:

InvalidationInterceptor designs

1. Refactor OptimisticReplicationInterceptor and ReplicationInterceptor to extend an abstract
   BaseRpcInterceptor (Protected methods such as replicateCall(), putCallOnAsyncReplicationQueue(),
   checkResponses()).  In future refactorings, this BaseRpcInterceptor could hold the JGroups Channel,
   etc.

2. InvalidationInterceptor to extend BaseRpcInterceptor

3. InvalidationInterceptor to replace either OptimisticReplicationInterceptor or ReplicationInterceptor
   in the InterceptorChain if configured.

4. In addition to the existing cache modes (LOCAL, REPL_SYNC, REPL_ASYNC) we'd also have INVALIDATION_SYNC
   and INVALIDATION_ASYNC

5. The interceptor only kicks in when receiving a CRUD method - ignore all other methods.

    5.1. If we are not in a tx: broadcast an evict(Fqn).
    5.2. Else: register a sync handler. beforeCompletion() will broadcast an evict(Fqn) for every
         CRUD method in the modification list upon commit.  Some efficiency can be gained here,
         by analysing the Fqn's we are evicting, and only calling evict() on the topmost node
         necessary. E.g., if we need to invalidate /a/b and /a/b/c, only call evict on /a/b.
         afterCompletion() doesn't do anything - regardless of a successful commit or a rollback.
