Make Database facade use more consistent across data stores

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.

There are two main reasons for this change:
- Ensure that the correct provider-specific Database facade is always used even when multiple providers have registered services
- Change the way the ApplyMigrations method is implemented such that, in an upcoming change, it can be decoupled from direct use of DbContextConfiguration.