Lock

adds `.lock()` and `.unlock()`.

cc @calvinfo @gjohnson 
lock error is definitely bad--what do you think about calling back the `fn` or retrying when that happens? otherwise we might have some callbacks which hang indefinitely if there's ever a redis hiccup