Use read/write locks for construction of the final dependency graph.
Value specifications (and properties) are normalised - compare by identity.
Use a more efficient iterator over digest based resolution candidates.
Guard against possible NPE if finished state happens near a discard.