Invert Dependencies

Do not depend on concretion but on abstractions. Make both low-level modules and high-level modules depend on common abstractions.