add initial .locked(key, fn)

cc @calvinfo 

how does that look ?
kinda hard to test, if you have any suggestions on more tests let me know.
maybe we should add a test that uses redis list and we can check that the events are in sorted order.
Actually, maybe we could do something to ferry along the arguments as well:

```js
db.hget('users', msg.userId(), function(err, value){
   if (err) return unlock(fn, err);
   if (value) return unlock(fn, null, value);
   db.hset('users', msg.userId(), msg.event(), function(err){
        unlock(fn, err);
   });
});
```

Seems like that would take care of the problems, and then we decide not to pass back errors from `unlock`, but log them or something instead