Improve ValidateContextDirectory error handling.

I was looking where the panic from #8006 was coming from and found some issues with the `ValidateContextDirectory()` function. 

- Errors sent to the walker callback functions were ignored. This meant that
  one could get a panic when calling methods on a nil FileInfo object. For
  example when the file did not exists any more.

- Lstat calls inside walker callback are reduntant because walker already calls Lstat
  and passes the result to the callback.

- Error returned from filepath.Rel() can never be EACCES because it compares
  strings and does not care about actual files. That error case will not appear
  because of the algorithm used here.

- If Matched() returns error then ValidateContextDirectory() must return error.
  Currently it still kept walking although the outcome was already known. 

- Function will now fail in case of unknown error(not EACCES nor ENOENT).
  Previous implementation did not make a clear decision about this (but 
  panicked because of the issues above).


Just to be clear, this does not fix #8006 (at least not for all cases) but it will give a correct error message instead of a panic.
Can't say that I agree with this comment.

There is no path how this code could be executed. If go was smart enough it would strip it out before compilation.

You can't have error checks to protect future programmers from making stupid mistakes. There are number of ways how one could make a minimal tweak to this function and have it return a wrong result or panic at runtime. You don't add protection against such cases.

Also note that the original problem with this line was that it had error handling but the meaning of it had confused someone.

I would see it making sense if it would make the code easier to read/understand, but that doesn't seem to be the case at the moment.

If its needed for the merge, I'll add it of course. No biggie.