lib/collection: add `Iterator::is_still_valid`

Maybe put it in a superclass of Iterator and MapIterator?
However the refactorisation of iterators is a distinct issue that should wait a little more.

Signed-off-by: Jean Privat <jean@pryen.org>
lib/collection: policy on iteration and strucutral modification

This implements a java-like policy on iterators where a structural
modification on the underliing collection is detected and aborts the
program.

The nice class `CanaryProtection` from `abstract_collection` implements
all the logic.

This is a POF; however a couple of bugs was already discovered (see
previous commits in the series)

TODO before inclusion:

* validate the policy
* run tests
* look at the performance loss

Fixes #352
Signed-off-by: Jean Privat <jean@pryen.org>