Consider line 499:
l.last, err = l.client.Set(context.Background(), l.key, l.value, setOpts)
It is possible for Set() to succeed, and immediately the following call to Set() from a different goroutine to fail - modifying l.last to be nil. Which will then result in Unlock() not issuing a Delete call and so not unlocking.