refactor asset artifact collection to use upfront declaration
Previously, the build system collected artifacts by walking the filesystem after
all assets were built. Now assets declare their artifacts upfront via getArtifacts(),
and the build system collects them during the build process through channels.
Changes:
- Replace BuildResult sealed class with getArtifacts()/build() pattern
- Remove collectArtifacts() filesystem scanning
- Change from BuildArtifact wrapper objects to plain Path objects
- Add validation that declared artifacts actually get created
- Update AssetsArchiveCompressor to work with paths instead of types