cmd/buildlet: recreate accidentally deleted dirs lazily

The buildlet's /removeall handler previously restored any deletes of
important directories (the $WORKDIR, $GOCACHE, and $TMP) immediately
after the deletes, before the /removeall handler returned to the
client.

Unfortunately, some clients actually do want to delete $GOCACHE and
$TMP: in CL 159257 (submitted too early), cmd/release wants to delete
those before tarring/zipping up the rest of $WORKDIR to ship a
release.

This CL changes the remove handler to just remove stuff without fixing
mistakes. Instead, missing directories are created lazily later if
needed.

Also, minor debug logging change to cmd/release that I hadn't yet
uploaded to CL 159257 before it was submitted.

Fixes golang/go#29906

Change-Id: Ifb5d3c16e2d83e7ac9e7f8e353d1b7b866f7d338
Reviewed-on: https://go-review.googlesource.com/c/159320
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
diff --git a/cmd/release/release.go b/cmd/release/release.go
index 9d69adc..8a30f2e 100644
--- a/cmd/release/release.go
+++ b/cmd/release/release.go
@@ -532,7 +532,7 @@
 	}
 
 	// And verify there's no other top-level stuff besides the "go" directory:
-	if err := checkTopLevelDirs(client); err != nil {
+	if err := b.checkTopLevelDirs(client); err != nil {
 		return fmt.Errorf("verifying no unwanted top-level directories: %v", err)
 	}
 
@@ -544,15 +544,15 @@
 
 // checkTopLevelDirs checks that all files under client's "."
 // ($WORKDIR) are are under "go/".
-func checkTopLevelDirs(client *buildlet.Client) error {
+func (b *Build) checkTopLevelDirs(client *buildlet.Client) error {
 	var badFileErr error // non-nil once an unexpected file/dir is found
 	if err := client.ListDir(".", buildlet.ListDirOpts{Recursive: true}, func(ent buildlet.DirEntry) {
-		if badFileErr != nil {
-			return
-		}
 		name := ent.Name()
 		if !(strings.HasPrefix(name, "go/") || strings.HasPrefix(name, `go\`)) {
-			badFileErr = fmt.Errorf("unexpected filename %q found after cleaning", name)
+			b.logf("unexpected file: %q", name)
+			if badFileErr == nil {
+				badFileErr = fmt.Errorf("unexpected filename %q found after cleaning", name)
+			}
 		}
 	}); err != nil {
 		return err