another version of zipAll/zipWithAll which doesn't make finite streams infinite

for current implementation `Stream(1).zipAll(Stream(2)).toList` never terminates
and `Stream(1).zipAll(Stream(2)).take(2).toList` returns `List((Some(1), Some(2)),(None, None)) `
the implementation in this PR makes it work as you will expect, given the definition of `zipAll`:
`The zipAll function should continue the traversal as long as either stream has more elements`