add LockManager

Giovanni to review

To support both

```
obj, lock = Foo.get_locked_obj(id)
```

and

```
with Foo.get_locked_obj(id) as obj:
    ...
```

syntaxes.

Also add a `degrade_gracefully` option for what to do when redis is down