llm: make Tool.Run return ToolOut

This is preliminary work towards
allowing tools to add additional information.
No functional changes (at least, that's the intent).
diff --git a/claudetool/keyword.go b/claudetool/keyword.go
index 7f2c492..69b789e 100644
--- a/claudetool/keyword.go
+++ b/claudetool/keyword.go
@@ -83,10 +83,10 @@
 	return strings.TrimSpace(string(out)), nil
 }
 
-func keywordRun(ctx context.Context, m json.RawMessage) ([]llm.Content, error) {
+func keywordRun(ctx context.Context, m json.RawMessage) llm.ToolOut {
 	var input keywordInput
 	if err := json.Unmarshal(m, &input); err != nil {
-		return nil, err
+		return llm.ErrorToolOut(err)
 	}
 	wd := WorkingDir(ctx)
 	root, err := FindRepoRoot(wd)
@@ -100,7 +100,7 @@
 	for _, term := range input.SearchTerms {
 		out, err := ripgrep(ctx, wd, []string{term})
 		if err != nil {
-			return nil, err
+			return llm.ErrorToolOut(err)
 		}
 		if len(out) > 64*1024 {
 			slog.InfoContext(ctx, "keyword search result too large", "term", term, "bytes", len(out))
@@ -110,7 +110,7 @@
 	}
 
 	if len(keep) == 0 {
-		return llm.TextContent("each of those search terms yielded too many results"), nil
+		return llm.ToolOut{LLMContent: llm.TextContent("each of those search terms yielded too many results")}
 	}
 
 	// peel off keywords until we get a result that fits in the query window
@@ -119,7 +119,7 @@
 		var err error
 		out, err = ripgrep(ctx, wd, keep)
 		if err != nil {
-			return nil, err
+			return llm.ErrorToolOut(err)
 		}
 		if len(out) < 128*1024 {
 			break
@@ -143,10 +143,10 @@
 
 	resp, err := convo.SendMessage(initialMessage)
 	if err != nil {
-		return nil, fmt.Errorf("failed to send relevance filtering message: %w", err)
+		return llm.ErrorfToolOut("failed to send relevance filtering message: %w", err)
 	}
 	if len(resp.Content) != 1 {
-		return nil, fmt.Errorf("unexpected number of messages in relevance filtering response: %d", len(resp.Content))
+		return llm.ErrorfToolOut("unexpected number of messages in relevance filtering response: %d", len(resp.Content))
 	}
 
 	filtered := resp.Content[0].Text
@@ -159,7 +159,7 @@
 		"filtered", filtered,
 	)
 
-	return llm.TextContent(resp.Content[0].Text), nil
+	return llm.ToolOut{LLMContent: llm.TextContent(resp.Content[0].Text)}
 }
 
 func ripgrep(ctx context.Context, wd string, terms []string) (string, error) {