sources and sinks should use io.Reader/Writer

(Go actually intentionally randomizes iteration order on maps to prevent people from assuming any consistent ordering)