Cleanroom

This is not the nicest way to do clean up. It's not very DRY in some places and could really do with a refactor if we move to the Service/Provider as classes model. For now, with how the Service class (etc) is structured, this is about as good as I can do, I think
if there are no valid providers, given the intersection of `limit_providers` and `cls.providers`, it uses `cls.providers`