Offer single entry point to add / set elements

To simplify implementation of specific behavior (i.e: validating data) when extending ArrayCollection, a single entry point for all "set" operations would be welcome.
The main downside of this PR is the operation made in constructor: we need to manually loop through elements in order to add them one by one. This have a significant performance impact on very large collections.
well, this is a limitation of ArrayAccess. ``$collection[null]`` and ``$collection[]`` both pass ``null`` as value, while ``$array[null]`` and ``$array[]`` have different behavior.

Passing an explicit ``null`` as key is unlikely, given it is not a valid key. On the other hand, people expect ``$collection[]`` to append the element.

The Collection interface defines that the argument for ``set()`` is a string or an integer. Passing ``null`` here is abusing the interface (and the fact that PHP does not have a way to check this easily without adding overhead)