CHEF-3404: Provider Resolver

Implements lazy evaluation of which chef provider to use based on evaluating the system.  Lets the the service resource select its provider based on interrogating the system rather than assigning a single default provider per distro.  Providers encapsulate their own logic for determining which resources they support.
So say you have Upstart+Invokercd+Debian+systemd on the system. If `:upstart` says I can replace `:invokercd`, `:debian` & `:systemd` and `:systemd` says I can replace `:invokercd`, `:debian` & `:upstart` how do we decide which one to pick? 

I think one thing we can to is to add an option to `provides` called `:default` by which provider can declare themselves the `:default` provider on a given platform. This way if we see multiple providers or if we're in why-run mode we can assume the provider who declares itself as default. 

We will need to have some warning messages for more than one provider who declare themselves as default and pick the last one. Since our ordering is consistent we will always get the same default.

I think `replaces` is putting cross dependencies to providers and making the whole system fragile.