Commonizing code in option provider

* Adding ValueProviderFactoryProvider and CompositeValueProviderFactory to
  maintain parity in pattern with other option types.

Fixes #818
This name makes it seem like this class is a *provider for options* - rather than a *provider for TOption objects based on options*. Maybe OptionBasedProvider?

I don't love my own idea. If we come up with something improved let's go with it, otherwise ignore