sketch: add support for 'external' message types

- adds a new CodingAgentMessageType for loop.AgentMessage
- adds an new /external handler to loophttp.go
- modifies Agent to pass the .TextContent of ExternalMessage into the convo
  as though it came from the user.
- adds sketch-external-message web component, with a template for
  github workflow run events specifically.
- adds demos for sketch-external-message
diff --git a/loop/server/loophttp_test.go b/loop/server/loophttp_test.go
index fa591b2..8d4583e 100644
--- a/loop/server/loophttp_test.go
+++ b/loop/server/loophttp_test.go
@@ -38,6 +38,11 @@
 	model                    string
 }
 
+// ExternalMessage implements loop.CodingAgent.
+func (m *mockAgent) ExternalMessage(ctx context.Context, msg loop.ExternalMessage) error {
+	panic("unimplemented")
+}
+
 // TokenContextWindow implements loop.CodingAgent.
 func (m *mockAgent) TokenContextWindow() int {
 	return 200000