This PR refactors reflections such that we can iterate over each reflection and ask the reflection object what scopes should be applied to the query we are currently building. This means we don't need to construct a scope_chain array and iterate that array in parallel with the "chain". Instead, we can just ask each item in the chain for the scopes that should be applied, then apply those scopes.
Implement `scopes` method on each Reflection
Each reflection should be responsible for returning the scopes needed to
query against the db.
Fix `scopes` implementation on `PolymorphicReflection`
`PolymorphicReflection` needs to be custom for handling scope lambdas
remove caching until we prove it is required
update comments and call `super`
Is better to use flat_map in stead of map().flatten.