Use Octopus::ShardTracking::* modules to factor out shard-tracking behavior

Lots of things want to track which shard they are associated with. For individual
ActiveRecord::Base (or Octopus::Model) objects, that's done using an attribute
called current_shard. For ActiveRecord::Associations::* and ActiveRecord::Relation
objects, it's done dynamically.

This commit formalizes the behavior of having a current_shard and being able to
run_on_shard and then implements two submodules that implement that behavior:

Octopus::ShardTracking::Attribute: Things that track current_shard using an attribute
Octopus::ShardTracking::Dynamic: Things that determine their current_shard dynamically

The ::Dynamic module also introduces a class method `sharded_methods` which allows
us to specify which instance methods should be run_on_shard for a given class, e.g.:

    sharded_methods :any?, :exists?, :find_by_sql
Add shard tracking support to CollectionProxy
Add Octopus::RelationProxy for shard-friendly (delayed) evaluation of ActiveRecord::Relation objects

The culmination of all of the other commits in this branch: the ability to get back
a RelationProxy object rather than a Relation object, so that the Relation remembers
which shard it is associated with even when evaluation of the relation is delayed.