[Ready] Item access refactor

See #9517
Not accessing the item in the vector directly is the goal of this thing (is this agreeable, or not needed?).

The item_modifier itself is more a shortcut:
```
for( size_t i = 0; i < g->m.i_at(x, y).size(); ++i ) {
    item tmp = g->m.i_at(x, y)[i];
    tmp.charges++;
    g->m.modify_item(x, y, index, tmp); // x, y again?, index again?
}
```
The item_modifier encapsulates some of that:
```
auto stack = g->m.i_at( x,  y ); // only time that x any are used.
for( it = stack.begin(); it != stack.end(); ++it ) {
    item_modifier tmp = *some_iterator;
    tmp.charges++;
    tmp.commit(); // x,y not needed, the index/iterator not needed.
}
```

Actually, `item_modifier::commit` might not be needed at all, instead one could commit automatically from within the destructor of item_modifier. One only creates a item_modifier when the item should be changed anyway.

An alternative that would not require the item_modifier but work very similar:
```
auto stack = g->m.i_at( x,  y ); // only time that x any are used.
for( it = stack.begin(); it != stack.end(); ++it ) {
    item tmp = *some_iterator;
    tmp.charges++;
    it->commit( tmp );
}
```
Basically the same, the commit function needs the iterator reference (stored in `item_modifier` or as `this`-parameter) and the item (supplied as parameter, or implicit from `this`).