ISPN-3094 Cache.putForExternalRead in DIST transactional mode is not replicated to other members

* Refactor PutForExternalReadTest into a hierachy to test combinations of REPL/DIST mode and various tx modes.
* Move the non-transactional implementation from NonTxDistributionInterceptor.handleWriteCommand and supporting methods to BaseDistributionInterceptor.handleNonTxWriteCommand.
* TxDistributionInterceptor.handleWriteCommand no longer overrides the method from BaseDistributionInterceptor.
* Move all BaseDistributionInterceptor.visitXYZ methods to the tx/non-tx derived classes which now invoke either handleNonTxWriteCommand or handleTxWriteCommand, as needed. For PFER we always invoke handleNonTxWriteCommand.
* Move method visitPutKeyValueCommand() and supporting methods of non-tx locking interceptor to the common base class of the hierarchy so derived classes can delegate to super if PUT_FOR_EXTERNAL_READ flag is set. This ensures non-tx behaviour for PFER even if the actual interceptor instance is tx capable.
* These refactorings also fix ISPN-3114 because putForExternalRead is now handled in the non-tx code which no longer tries to cast the context to a TxInvocationContext.
Refactor BaseDistStateTransferConsistencyTest and BaseReplStateTransferConsistencyTest with their respective subclasses into a single class to include all tests

* The new tests now also cover distributed mode on join (previously only leave was tested for DIST mode).
* DistStateTransferOnJoinConsistencyTest.testReplacePessimistic fails due to ISPN-3095.
ISPN-3095 Cache.replace() succeeds on originator but fails randomly on remote owners during state transfer in DIST mode with pessimistic locking

* TxDistributionInterceptor.ignorePreviousValueOnBackup() should return true also for pessimistic case
* This makes DistStateTransferOnJoinConsistencyTest.testReplacePessimistic() pass
Remove unused dependencies
ISPN-694 Temporary solution for in-memory expiration notifications