implement updateWithKey and rewrite delete to use this

I've split this into two commits: the first preserves the old `delete` function and includes benchmarks showing that it doesn't statistically affect performance, and the second removes it.

I didn't include a benchmark showing this, but for some reason CritBit performs even better on `updateWithKey` benchmarks relative to Map and Trie if the update function is *simpler* (e.g. `f k v = Just (v + 1)` instead of `f k v = Just (v + fromIntegral (C.byteCount k))`.