Iterate over collection snapshot for thread safety

With this change the receiver can be mutated concurrently on another thread
during a map or filter operation, without exception.

Hat tip to @JaviSoto for the suggestion to fix this.

More, this change brings the `NSArray` implementation in line with the other
collections by using -getObjects:range: to make a local c-array of the
`NSArray`'s contents, avoiding a method dispatch to access elements during
operation.