Make AssociationReflection#associated_dataset handle joining tables if necessary

Previously, associated_dataset did not join tables on many_to_many
and similar associations.  This ended up creating a great deal of
code duplication.  The primary reason for this is that previously
the join that Sequel did depended on the values of the object.
Previously, this code:

  Album.many_to_many :tags
  Album[1].tags

Resulted in this SQL:

  SELECT tags.*
  FROM tags
  INNER JOIN albums_tags ON ((albums_tags.tag_id = tag.id) AND
                             (album_tags.album_id = 1))

This commit changes it to use WHERE:

  SELECT tags.*
  FROM tags
  INNER JOIN albums_tags ON (albums_tags.tag_id = tag.id)
  WHERE (album_tags.album_id = 1)

By moving the condition that depended on the values of the
object from the JOIN ON clause to the WHERE clause, it is
possible to cache the dataset after the join but before the
key values are applied.  Then that dataset can be reused for
lazy loading, eager loading, and filtering by associations.

In addition to DRYing up a lot of duplicate code that set up
the correct joins, by caching the intermediate datasets,
performance improves.  It also results in SQL that is more natural.

This requires large mechnical changes to the specs due to the
change in SQL used, but no changes to the adapter or integration
tests.

Unfortunately, this does break backwards compatibility for
callers of AssociationReflection#associated_dataset for any
association that uses a JOIN.

This commit also contains some general cleanup of
AssociationReflection methods:

associated_eager_dataset now returns an unlimited dataset.

eager_loading_dataset replaces the combination of
eager_load_base_dataset and Model.eager_loading_dataset.
eager_load_base_dataset has been removed.

filter_by_associations_add_conditions_dataset_filter is now generic,
with an association specific
filter_by_associations_conditions_associated_keys method.

filter_by_association_limit_subquery has been replaced by
associated_eager_dataset, since they now would be identical.

union_eager_loader is also now generic, and union_eager_loader_proc
is no longer needed.

predicate_key_methods has been added for an array of methods to
send the currrent object to get values that the associated keys
should match.

association_dataset_proc has been added as a generic method,
returning a static proc shared by all associations. The proc
just calls the generic association_dataset_for with the object,
which now can just take the cached association_dataset and filter
it by the key.