This contract allows both built-in and custom integrations to:
1.) Define properties and relationships on the primary artifact
2.) Generate derived artifacts from the primary artifact
3.) Define relationships between the derived artifacts and between the derived and primary artifacts.
The contract is used in two separate steps. The first, buildArtifacts, is responsible for setting properties and
generating all derived artifacts. After this step, all artifacts are persisted in the repository, but *without* any
relationships. The second step creates all relationships, after which all artifacts are updated in the repository
and the relationships persisted. This separation of duties is mainly necessary for batch uploads, where all
artifacts must first be generated before relationships can be defined between them.
One or more AritfactBuilders are associated with one
ArtifactBuilderProvider. ArtifactBuilder logic
tends to be much cleaner when the builder is able to be *stateful*. Therefore, the provider creates builders on
demand, rather than singleton builder use.