when a plugin depends on an attribute that doesn't have a provider, look for providers in parent attribute(s)
move lookup of parent providers for attributes from runner to provides_map
separate out different ways of gathering attribute providers into different methods