claudetool/codereview: add caching in findRelatedFiles

Primary goal is latency reduction.
Also slightly reduces context usage.

Co-Authored-By: sketch <hello@sketch.dev>
Change-ID: sa1007d82a5165ab4k
diff --git a/claudetool/codereview/testdata/related_files_cache_same_changeset.txtar b/claudetool/codereview/testdata/related_files_cache_same_changeset.txtar
new file mode 100644
index 0000000..db640a5
--- /dev/null
+++ b/claudetool/codereview/testdata/related_files_cache_same_changeset.txtar
@@ -0,0 +1,95 @@
+Tests related files caching when the exact same set of changed files is processed multiple times
+
+-- a.go --
+package main
+
+func a() {}
+
+-- b.go --
+package main
+
+func b() {}
+
+-- c.go --
+package main
+
+func c() {}
+
+-- .commit --
+Create initial commit
+
+-- a.go --
+package main
+
+func a() {
+    // Update 1
+}
+
+-- b.go --
+package main
+
+func b() {
+    // Update 1
+}
+
+-- .commit --
+Update both a.go and b.go together (creates relationship)
+
+-- a.go --
+package main
+
+func a() {
+    // Update 2
+}
+
+-- b.go --
+package main
+
+func b() {
+    // Update 2
+}
+
+-- .commit --
+Update both a.go and b.go together again (strengthens relationship)
+
+-- a.go --
+package main
+
+func a() {
+    // Update 3
+}
+
+-- c.go --
+package main
+
+func c() {
+    // Update 1
+}
+
+-- .commit --
+Update a.go and c.go together (creates another relationship)
+
+-- a.go --
+package main
+
+func a() {
+    // Update 4 - first time processing this exact set
+}
+
+-- .commit --
+First time changing just a.go
+
+-- .run_test --
+OK
+-- a.go --
+package main
+
+func a() {
+    // Update 5 - second time processing this exact same set, should be cached
+}
+
+-- .commit --
+Second time changing just a.go (should be cached)
+
+-- .run_test --
+OK