Add collection foreach methods

(I'm aware the outstanding PRs will conflict with each other - please merge whichever you prefer, and I'll freshly rebase the others soon after)