Refactoring the way sets work

This is a first stab at refactoring the internal behaviour of sets.
This commit is a fully working commit that also alters the pre TF 0.2
providers, so the code can be compiled.

There are separate PR’s to migrate the ‘old’ providers to use the new
(post TF 0.2) schema.Provider approach so the refactored behaviour will
also work for those providers.