loading: even more thorough tests with corresponding bug fixes
Testing with project files with a name but not a uuid uncovered a
key issue: we were using `uuid == nothing` in two different senses.
One sense was "I don't care which uuid you give me, just give me
the first thing in the load path with this name." The other sense
was "I'm loading with respect to a project file with no explicit
uuid assigned to it, but that's the one I need to load from." In
order to differentiate them, these changes introduce "dummy uuids":
when a project file doesn't have a real uuid, we assign it one by
hashing its path. This allows loading dependencies with respect to
that file only (which is necessary for correct semantics), without
forcing every project file to have an explicit uuid. This may seem
of limited utility, but it's handy for named environments and
projects that haven't graduated to being full blown packages yet.