After thinking about it, I don't think that this interface is enough to keep the interface to this map safe. Once you have created a `BucketState`, there's nothing preventing you from modifying the underlying map.

For example, I could create two `EmptyIndex` via two calls to `peek`, and then fill in one of them and attempt to fill in the other. To be truly safe, I think this may have to have a signature that looks like:

```rust
fn peek<'a>(&'a mut self, index: uint) -> BucketState<'a> { ... }
```

That will certainly make the rest of the interface to this more difficult, but I don't think that it's a safe abstraction unless you have something like that.