Generic locking mechanism.

Based on the "BPOP" commands this adds a generic locking command (similar to advisory locks in mysql).

Basic usage is

> C1: GRAB sesskey.AE123 0

> C1: OK

> C2: GRAB sesskey.AE123 0

> C1: RELEASE sesskey.AE123

> C1: OK

> C2: OK

Also if a client disconnects all of it's locks are released.

A client MAY lock multiple keys.

Some things I don't like about how it's implemented right now.
I've kludged in some "reserving" of the Key in (doing a dbAdd of a 0 value) and checking to make sure it's a REDIS_STRING (so as to not conflict with BPOP). However this has a few issues.

the lock does nothing to prevent working with the actual key (and really shouldn't). So another client can delete and readd the key as a REDIS_LIST and screw things up.

Ideally I need to create a separate blocking system from the BPOP blocks, or adjust how they are stored so that BPOP will ignore GRAB blocks and GRAB will ignore BPOP locks.

Any thoughts on this are very welcome.