Issue 11319 - std.range.zip is not nothrow.

https://issues.dlang.org/show_bug.cgi?id=11319

This is one way of implementing this, but there could be other ways. Essentially I've turned Exceptions into Errors.

I've also marked all zip unittests as `nothrow`, although I've had to wrap some `sort` calls which can still throw.

This is a breaking change if user-code was already catching exceptions thrown from within `Zip`. The only reason I could think this would happen is if the user called zip from within a `nothrow` function and was forced to catch Exceptions. They wouldn't have to do that anymore.