Item refactoring

This PR reduces Item's dependencies and public API.

An important change is the way an item impacts its container. Calling `Item.new` should not cause the item's container to be modified. The container is now touched only when calling `container.item ...` or `container.items = ...`. It moves the responsibility from Item to ItemContainer where it belongs.