Normalize array iteration methods and null array handling

Fixes #58.

So this PR got pretty large :smile:. I was working on standardizing on `while` loops in `array/*` methods and noticed that some methods were handling `null` as an empty array, while some weren't. I made the `null` behavior explicit in the tests, so that it will treat `null` and `undefined` as empty arrays wherever possible (except when modifying the array, which obviously can't be null).