Versioned formula reqs manager

Eventually the Shaker class should be split out into its own module/dist but it can live here for now.

Thanks to @Sym for taking my shonky code and making the structure nicer.