dirstate.walk: maintain a list of dirs not found

Upcoming patches will factor out the walk over explicit files done in step 1.
This helps us get there.
dirstate.walk: move dirignore filter out of explicit walk code

This is a move towards factoring this code out into a separate function.
dirstate.walk: pull skipstep3 out of the explicit walk code

This is a move towards factoring out this code into a separate function.
dirstate.walk: refactor explicit walk into separate function

This enables this code to be reused by extensions that implement the other,
more time-consuming bits of walk in different ways.
dirstate._walkexplicit: rename work to dirsfound

Now that this code is factored out, work is too specific a name.
dirstate._walkexplicit: inline dirsnotfound.append
clone: move file stream walk to a separate function

Moves the file walk out of the stream method so that extensions can override it.

This allows an extension to decide what files should be streamed, and in
particular allows a stream without filelogs.
store: move top file walk to a separate function

Some extensions find it useful to be able to walk the non-data files in the
repo, so I'm moving that part of the walk to a separate function.

In particular, this allows an extension to interact with only the non-filelog
store data (for instance, when cloning everything but filelogs).
copies: refactor checkcopies() into a top level method

This moves checkcopies() out of mergecopies() and makes it a top level
function in the copies module. This allows extensions to override it. For
example, I'm developing a filelog replacement that doesn't have rev numbers
so all the rev number dependent implementation here needs to be replaced
by the extension.

No logic is changed in this commit.