Lock Improvements

Here's a better attempt at a refactor that allows for a high availability scheduling setup.

* distinguish between a `@scheduler_lock`, which determines if a scheduler should come up, vs. a `@job_lock`, which determines if a triggered job should run
* allow both `:scheduler_lock` and `:job_lock` options to that no subclassing is needed to determine how your scheduler figures out its locking situation
* `:lockfile` option is still supported