(PUP-TODO) retrieve service/ensure only if necessary

This change is based on an idea with PoC by Jeff Bachtel, see
https://groups.google.com/forum/#!msg/puppet-dev/P8ReCHvmd2o/Zp1fjZZ6KIkJ

The ensure property is the first thing we retrieve for any resource,
as it can be responsible for other values. This can have unnecessary
performance implications for the service type, where it can be desirable
for users to manage only the enable property. Retrieving ensure in these
cases is spurious and expensive, because the provider must usually find out
about the state of some process in the system.

To allow the service type to not retrieve the ensure status unnecessarily,
add a new 'needs_ensure_retrieved' field to the Type class itself. It
defaults to true, but when a concrete type overrides it to false and
any resource does not manage ensure, skip the retrieval for this resource's
ensure property.