Cleanup interaction of DbSet and DbContextConfiguration

This is part of Issue #641 which is about cleaning up the use of DbContextConfiguration. DbContextConfiguration is intended to help resolve dynamic services--that is, services for which the actual type/instance of service to use depends on the current context configuration. However, it has gradually spread throughout the code as a general purpose service locator. This causes dependencies to be hidden and creates a lot of coupling to DbContextConfiguration throughout the code, so I am making a set of changes to help fix this.

In this case the DbSet needs to have access to DbContextConfiguration, through the context, because sets are created eagerly before the scoped service provider is created, but are then initialized lazily in the scope the first time they are used.
Nit: I think this would benefit from a comment "used to cache XXXXs" or some such thing. Otherwise it's a bit obscure what sort of objects are actually getting cached.