Can you say something about the contract here?  Above you return an exception if it doesn't succeed once.

If we have that, we might also put `retryingUpdate(k : K)(fn : Option[V] => Option[V]) : Future[Unit]` that will rescue and retry if there is a concurrent udate exception (or mark that as a TODO if you agree)