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.
the offset being null is what PHP does for ``$collection[] = $element``. We need to support it