Add "wuffs help foo" for the command line tool

Updates #62
diff --git a/cmd/wuffs/gen.go b/cmd/wuffs/gen.go
index 522f22b..bcb738c 100644
--- a/cmd/wuffs/gen.go
+++ b/cmd/wuffs/gen.go
@@ -37,7 +37,12 @@
 func doGenlib(wuffsRoot string, args []string) error { return doGenGenlib(wuffsRoot, args, true) }
 
 func doGenGenlib(wuffsRoot string, args []string, genlib bool) error {
-	flags := flag.NewFlagSet("gen", flag.ExitOnError)
+	flagSetName := `"wuffs gen <flags> std/pkg1 std/pkg2 etc"`
+	if genlib {
+		flagSetName = `"wuffs genlib <flags> std/pkg1 std/pkg2 etc"`
+	}
+
+	flags := flag.NewFlagSet(flagSetName, flag.ExitOnError)
 	genlinenumFlag := flags.Bool("genlinenum", cf.GenlinenumDefault, cf.GenlinenumUsage)
 	langsFlag := flags.String("langs", langsDefault, langsUsage)
 	skipgendepsFlag := flags.Bool("skipgendeps", skipgendepsDefault, skipgendepsUsage)
diff --git a/cmd/wuffs/main.go b/cmd/wuffs/main.go
index c768e00..e0a433c 100644
--- a/cmd/wuffs/main.go
+++ b/cmd/wuffs/main.go
@@ -52,6 +52,8 @@
 	gen     generate code for packages and dependencies
 	genlib  generate software libraries
 	test    test packages
+
+Use "wuffs help <command>" for more information about a command.
 `)
 }
 
@@ -76,6 +78,13 @@
 				return c.do(wuffsRoot, args[1:])
 			}
 		}
+		if (len(args) == 2) && (args[0] == "help") {
+			for _, c := range commands {
+				if args[1] == c.name {
+					return c.do(wuffsRoot, []string{"-help"})
+				}
+			}
+		}
 	}
 	usage()
 	os.Exit(1)
diff --git a/cmd/wuffs/test.go b/cmd/wuffs/test.go
index 23efe45..f67166e 100644
--- a/cmd/wuffs/test.go
+++ b/cmd/wuffs/test.go
@@ -29,16 +29,26 @@
 func doTest(wuffsRoot string, args []string) error  { return doBenchTest(wuffsRoot, args, false) }
 
 func doBenchTest(wuffsRoot string, args []string, bench bool) error {
-	flags := flag.NewFlagSet("test", flag.ExitOnError)
+	flagSetName := `"wuffs test <flags> std/pkg1 std/pkg2 etc"`
+	if bench {
+		flagSetName = `"wuffs bench <flags> std/pkg1 std/pkg2 etc"`
+	}
+
+	flags := flag.NewFlagSet(flagSetName, flag.ExitOnError)
 	ccompilersFlag := flags.String("ccompilers", cf.CcompilersDefault, cf.CcompilersUsage)
 	focusFlag := flags.String("focus", cf.FocusDefault, cf.FocusUsage)
-	iterscaleFlag := flags.Int("iterscale", cf.IterscaleDefault, cf.IterscaleUsage)
 	langsFlag := flags.String("langs", langsDefault, langsUsage)
 	mimicFlag := flags.Bool("mimic", cf.MimicDefault, cf.MimicUsage)
-	repsFlag := flags.Int("reps", cf.RepsDefault, cf.RepsUsage)
 	skipgenFlag := flags.Bool("skipgen", skipgenDefault, skipgenUsage)
 	skipgendepsFlag := flags.Bool("skipgendeps", skipgendepsDefault, skipgendepsUsage)
 
+	iterscaleFlag := (*int)(nil)
+	repsFlag := (*int)(nil)
+	if bench {
+		iterscaleFlag = flags.Int("iterscale", cf.IterscaleDefault, cf.IterscaleUsage)
+		repsFlag = flags.Int("reps", cf.RepsDefault, cf.RepsUsage)
+	}
+
 	if err := flags.Parse(args); err != nil {
 		return err
 	}
@@ -53,13 +63,15 @@
 	if !cf.IsAlphaNumericIsh(*focusFlag) {
 		return fmt.Errorf("bad -focus flag value %q", *focusFlag)
 	}
-	if *iterscaleFlag < cf.IterscaleMin || cf.IterscaleMax < *iterscaleFlag {
-		return fmt.Errorf("bad -iterscale flag value %d, outside the range [%d ..= %d]",
-			*iterscaleFlag, cf.IterscaleMin, cf.IterscaleMax)
-	}
-	if *repsFlag < cf.RepsMin || cf.RepsMax < *repsFlag {
-		return fmt.Errorf("bad -reps flag value %d, outside the range [%d ..= %d]",
-			*repsFlag, cf.RepsMin, cf.RepsMax)
+	if bench {
+		if *iterscaleFlag < cf.IterscaleMin || cf.IterscaleMax < *iterscaleFlag {
+			return fmt.Errorf("bad -iterscale flag value %d, outside the range [%d ..= %d]",
+				*iterscaleFlag, cf.IterscaleMin, cf.IterscaleMax)
+		}
+		if *repsFlag < cf.RepsMin || cf.RepsMax < *repsFlag {
+			return fmt.Errorf("bad -reps flag value %d, outside the range [%d ..= %d]",
+				*repsFlag, cf.RepsMin, cf.RepsMax)
+		}
 	}
 
 	args = flags.Args()