SLF4j 311 - Enable swapping of NOPLogger in SubstituteLoggerFactory

Changed the implementation of `SubstituteLoggerFactory` to return a `SubstitutableLogger` which can delegate to a different logger implementation. By default it uses `NOPLogger` but enables changing the delegate.

An application can later find out the list of `SubstitutableLogger` and replace the delegate with right implementation. An application must also clear the SubstitutableLogger map to prevent any possible memory leaks