Streaming numpy save

Use `numpy.nditer` to stream the bytes content to the `write` method of a custom file object using buffered chunks so as to avoid a full array memory copy.

This is more stable replacement for #4075 that tried to use a `memoryview` instance to remove the memory copy in the contiguous case.