Support multiple clock and lag strategies

This commit refactors the default master slave adapter behaviors into different
modules:

Constency Behaviors:

  DefaultClock: Uses a Clock comparator to compare master/slave position
  HeartbeatClock: Queries a heartbeat table to determine consistency

Lag Strategies:

  DefaultStrategy: Only checks consistency in with_consistency
  RelaxedStrategy: Checks consistency by default, falling back to master if the
    amount of lag is greater than the allowed lag (config[:loose_lag]). When
    `with_constency` is requested the config[:strict_lag] threshold is used instead.
  StrictStrategy: Checks consistenvy by default, raising a LagException if the
    amount of lag is greater than the allowed lag (config[:loose_lag]). When
    `with_constency` is requested the config[:strict_lag] threshold is used instead.

The way to enable a HeartbeatClock or DefaultClock is to set
config[:clock_implementation] to 'HeartbeatClock' or 'DefaultClock'.

The way to enable a LagStrategy is to set config[:lag_strategy] to one of
'DefaultStrategy', 'RelaxedStrategy', or 'StrictStrategy'.

Change-Id: I2e9049bec9d8ef303c265588c0870a8f0bdff4eb
Reviewed-on: https://gerrit.causes.com/17242
Reviewed-by: John Skopis <john.skopis@causes.com>
Tested-by: John Skopis <john.skopis@causes.com>