Document.remove_item() does not clear the Tree's cache.

TODO:

- [ ] create a `Cache` class to facilitate mocking?
- [ ] cache `Tree` and `Document` in a similar way
- [ ] invalidate and update caches consistently in `Tree`, `Document`, and `Item`
- [ ] create a full caching integration test