Extensible Languages for Flexible and Principled Domain Abstraction