Commonizing code in option provider

* Adding ValueProviderFactoryProvider and CompositeValueProviderFactory to
  maintain parity in pattern with other option types.

Fixes #818
`OptionBasedProvider` works for me. It's not a user-facing type so we should be fine not using the "Base" suffix on abstract base types.