We consider the design of regenerating codes for distributed storage systems that allow for exact and uncoded (table-based) repair by leveraging the properties of combinatorial structures known as resolvable designs. Our constructions from affine geometries and Hadamard designs allow the design of systems where a failed node can be exactly regenerated by downloading $\beta$ packets each from a subset of the surviving nodes, where $\beta \geq 1$ (prior work only considered $\beta = 1$). We also present techniques for the iterative construction of new codes from existing ones. Our proposed approach allows system resilience to node failures to be tunable over a large range. We answer an open question posed in prior work by demonstrating codes that are not derived from Steiner systems.