New completer

This PR adds a new completer.py which is driven from the domain model rather than the low-level model and therefore is aware of customizations.