Moves storage module to use prototypes for inheritance and structure.

addresses #2852

- Moves storage modules to use prototypes and to create prototypes
that inherit from the base storage ctor.
This is the same patter we use in GhostMailer I believe, and from conversations I've had with @javorszky it's made it really hard to test?

I'm not sure if it got fixed, but it was just impossible to override anything inside using rewire because, I think, and I may be utterly wrong, it didn't turn out to be a true singleton?