[Ready] Item access refactor

See #9517
The problem I have is that it doesn't follow normal c++ container semantics.  To use it you have to make these modify and commit calls for no benefit, because if a method contains a single modify() call, you've thrown const correctness out already and might as well just use read/write accessors, which are simpler and better understood.

To address your question, I don't see the benefit of hiding the vector of items, if we use iteration best practices, the difference between the containers becomes moot for most purposes, and for the special cases you need to know what the differences in semantics are anyway.

For your example, what we can do right now is:
```
auto &item_stack = g->m.i_at(x, y);
for( auto an_item = item_stack.begin(); an_item != item_stack.end(); ++an_item ) {
    an_item->charges++;
}
```
Which is similar to your last example, but doesn't require the weird commit call or this whole layer of indirection.

IMO the goal of const correctness is to make everything you can const, but if you need to modify something, hiding that behind a layer of indirection doesn't change anything, you're still changing something's data.

I was totally happy with the original idea, which was making i_at() return a const reference, but that didn't happen, so now there are *two* non-const accessors for items on the map, one of which has a strange interface.

If there's something I'm not getting please enlighten me and I'll apologize for being slow, but I don't see how this improves anything right now.