refactor storage to a separate class

moves storage to a separate MockStorage class that is only responsible for storage, while all the pipeline methods remain in MockPipeline

only in MockStorage class will need to be synchronized
From my perspective there are two main options to use `final`: on fields and on classes. In all other cases, when methods are not 100500 lines long, it is useless (code become less readable without any advantages).
P.S. In Java 8 we even have "effectively final" variables.