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
to ensure immutability, but I agree that it might be a bit over the top