Add a Lock object

Locks are similar to leader elections, but the interface is quite different. Instead of running as a seperate actor, this lock blocks the calling code until acquire is complete.
Note the convenient with helper, eg:
```ruby
my_lock.with do
  # critical section
end