Appends one module's facts at a time to per-relation .facts files,
opening each file on first use. Rows land in the order extraction
yields them, which Argus.Pipeline keeps deterministic.
Summary
Types
@type t() :: %Argus.Pipeline.Writer{ dir: Path.t(), files: %{required(atom()) => File.io_device()}, written: MapSet.t(atom()) | nil }