only instantiate providers once.

This allows them to memoize values at their discretion