ant: improve encapsulation

- Replace string literals with package constants for message roles and content types.
- Create UserStringMessage helper function to simplify user message creation
- Replace manual Content creation with ant.StringContent()

Co-Authored-By: sketch <hello@sketch.dev>
diff --git a/loop/agent_user_cancel_test.go b/loop/agent_user_cancel_test.go
index f79e73e..e55ba17 100644
--- a/loop/agent_user_cancel_test.go
+++ b/loop/agent_user_cancel_test.go
@@ -21,12 +21,7 @@
 			inbox:  make(chan string, 1),
 			outbox: make(chan AgentMessage, 1),
 		}
-		userMsg := ant.Message{
-			Role: "user",
-			Content: []ant.Content{
-				{Type: "text", Text: "hi"},
-			},
-		}
+		userMsg := ant.UserStringMessage("hi")
 		userMsgResponse := &ant.MessageResponse{}
 		mockConvo.ExpectCall("SendMessage", userMsg).Return(userMsgResponse, nil)
 
@@ -55,9 +50,9 @@
 			outbox: make(chan AgentMessage, 1),
 		}
 		userMsg := ant.Message{
-			Role: "user",
+			Role: ant.MessageRoleUser,
 			Content: []ant.Content{
-				{Type: "text", Text: "hi"},
+				{Type: ant.ContentTypeText, Text: "hi"},
 			},
 		}
 		userMsgResponse := &ant.MessageResponse{
@@ -86,7 +81,7 @@
 			},
 		}
 		toolUseResultsMsg := ant.Message{
-			Role:    "user",
+			Role:    ant.MessageRoleUser,
 			Content: toolUseContents,
 		}
 		toolUseResponse := &ant.MessageResponse{
@@ -132,12 +127,7 @@
 			inbox:  make(chan string, 1),
 			outbox: make(chan AgentMessage, 10), // don't let anything block on outbox.
 		}
-		userMsg := ant.Message{
-			Role: "user",
-			Content: []ant.Content{
-				{Type: "text", Text: "hi"},
-			},
-		}
+		userMsg := ant.UserStringMessage("hi")
 		userMsgResponse := &ant.MessageResponse{
 			StopReason: ant.StopReasonToolUse,
 			Content: []ant.Content{
@@ -153,12 +143,7 @@
 				OutputTokens: 200,
 			},
 		}
-		toolUseResultsMsg := ant.Message{
-			Role: "user",
-			Content: []ant.Content{
-				{Type: "text", Text: cancelToolUseMessage},
-			},
-		}
+		toolUseResultsMsg := ant.UserStringMessage(cancelToolUseMessage)
 		toolUseResponse := &ant.MessageResponse{
 			StopReason: ant.StopReasonEndTurn,
 			Content: []ant.Content{
@@ -223,9 +208,9 @@
 			outbox: make(chan AgentMessage, 10), // don't let anything block on outbox.
 		}
 		userMsg := ant.Message{
-			Role: "user",
+			Role: ant.MessageRoleUser,
 			Content: []ant.Content{
-				{Type: "text", Text: "hi"},
+				{Type: ant.ContentTypeText, Text: "hi"},
 			},
 		}
 		userMsgResponse := &ant.MessageResponse{
@@ -244,9 +229,9 @@
 			},
 		}
 		toolUseResultsMsg := ant.Message{
-			Role: "user",
+			Role: ant.MessageRoleUser,
 			Content: []ant.Content{
-				{Type: "text", Text: cancelToolUseMessage},
+				{Type: ant.ContentTypeText, Text: cancelToolUseMessage},
 			},
 		}
 		toolUseResultResponse := &ant.MessageResponse{
@@ -263,9 +248,9 @@
 			},
 		}
 		userFollowUpMsg := ant.Message{
-			Role: "user",
+			Role: ant.MessageRoleUser,
 			Content: []ant.Content{
-				{Type: "text", Text: "that was the wrong thing to do"},
+				{Type: ant.ContentTypeText, Text: "that was the wrong thing to do"},
 			},
 		}
 		userFollowUpResponse := &ant.MessageResponse{
@@ -339,12 +324,7 @@
 
 		// Define test message
 		// This simulates something that would result in claude  responding with tool_use responses.
-		userMsg := ant.Message{
-			Role: "user",
-			Content: []ant.Content{
-				{Type: "text", Text: "use test_tool for something"},
-			},
-		}
+		userMsg := ant.UserStringMessage("use test_tool for something")
 		// Mock initial response with tool use
 		userMsgResponse := &ant.MessageResponse{
 			StopReason: ant.StopReasonToolUse,
@@ -370,11 +350,8 @@
 			},
 		}
 		canceledToolUseMsg := ant.Message{
-			Role: "user",
-			Content: append(canceledToolUseContents, ant.Content{
-				Type: ant.ContentTypeText,
-				Text: cancelToolUseMessage,
-			}),
+			Role:    ant.MessageRoleUser,
+			Content: append(canceledToolUseContents, ant.StringContent(cancelToolUseMessage)),
 		}
 		// Set up expected behaviors
 		waitForSendMessage := make(chan any)