More optimizations around aggregation, and cleaning up event firing. Optimizations involve reading/parsing sets of relationships from multiple projects WITHOUT storing them, then storing all accumulated relationships for a given discovery iteration at once to avoid multiple cycle-detection passes.