Add in-memory traversal for :through associations

If the :through association is loaded and its :source association
is also loaded, AR can retrieve has_one/has_many :through records
without querying DB.

```ruby
class Author
  has_many :posts
  has_many :comments, :through => :posts
end

class Post
  belongs_to :author
  has_many :comments
end

class Comment
  belongs_to :post
end

author = Author.includes(:posts => :comments).first
# previously `author.comments.to_a` would issue an additional
# redundant SQL query (to load comments again), now instead
# since both `author.posts` and `author.posts.comments` are
# loaded, AR is smart enough to traverse in memory object graph
# to avoid hitting DB. Essentially it will now do
# `author.posts.map(&:comments).compact`.
author.comments.to_a # this will now not issue an SQL query
```

I'm not that comfortable around this part of AR code a thorough review
by AR-association masters is in order :bowtie:. 
What do you think about this?

```ruby
target_associations = through_proxies.map { |p| association_if_loaded_and_not_stale(p, source_reflection_name) }
if target_associations.all?
  if is_collection
    records = target_associations.flat_map(&:target)
  else
    records = target_associations.map(&:target).filter { |target| throught_proxy_target_source_type_matches?(target) }
  end
else
  records = nil
end
```