Components publish to Packagist through per-component split repos
created by `git filter-repo` in `bin/split-code.sh`. Packagist then
builds dist tarballs with `git archive`, which honors `.gitattributes`
`export-ignore` and ignores the `archive.exclude` blocks our
`composer.json` files relied on. So every release has been shipping
`Tests/` and fixtures to downstream users — meaningful bloat on Git (~29
MB), XML (~15 MB), and others.
This adds a `.gitattributes` inside each `components/<Name>/` so it
lands at the split repo root with the right `export-ignore` patterns,
and removes the dead `archive` blocks from each component
`composer.json`. Runtime is unaffected: every component already has
`"exclude-from-classmap": ["/Tests/"]` in its autoload, so dropping
`Tests/` from the dist tarball can't break consumers.
Cut a release after merge to flush the smaller tarballs to Packagist.