Implement error reporting for the bindings generator.

This feature aggregates nonfatal errors encountered while generating bindings and writes a JSON report to a file. It can be activated by passing `--//path/to/crubit/bazel_support:generate_error_report` to a Bazel build that generates bindings. The error report is named `${cc_library}_rust_api_error_report.json` and appears in the output directory alongside the generated bindings.

PiperOrigin-RevId: 481263077
diff --git a/rs_bindings_from_cc/generate_bindings_and_metadata_test.cc b/rs_bindings_from_cc/generate_bindings_and_metadata_test.cc
index 6decefc..4cb60e3 100644
--- a/rs_bindings_from_cc/generate_bindings_and_metadata_test.cc
+++ b/rs_bindings_from_cc/generate_bindings_and_metadata_test.cc
@@ -42,7 +42,8 @@
           /* public_headers= */ {"a.h"}, std::string(kTargetsAndHeaders),
           /* extra_rs_srcs= */ {},
           /* srcs_to_scan_for_instantiations= */ {},
-          /* instantiations_out= */ ""));
+          /* instantiations_out= */ "",
+          /* error_report_out= */ ""));
 
   ASSERT_OK_AND_ASSIGN(
       BindingsAndMetadata result,
@@ -52,6 +53,7 @@
 
   ASSERT_EQ(result.ir.used_headers.size(), 1);
   ASSERT_EQ(result.ir.used_headers.front().IncludePath(), "a.h");
+  ASSERT_EQ(result.error_report, "");
 
   // Check that IR items have the proper owning target set.
   auto item = result.ir.get_items_if<Namespace>().front();
@@ -71,7 +73,8 @@
           /* public_headers= */ {"a.h"}, std::string(kTargetsAndHeaders),
           /* extra_rs_srcs= */ {},
           /* srcs_to_scan_for_instantiations= */ {},
-          /* instantiations_out= */ ""));
+          /* instantiations_out= */ "",
+          /* error_report_out= */ ""));
 
   ASSERT_OK_AND_ASSIGN(
       BindingsAndMetadata result,
@@ -100,7 +103,7 @@
           {"a.h"}, std::string(kTargetsAndHeaders),
           /* extra_rs_srcs= */ {},
           /* srcs_to_scan_for_instantiations= */ {a_rs_path},
-          "instantiations_out"));
+          "instantiations_out", /* error_report_out= */ ""));
 
   CRUBIT_ASSIGN_OR_RETURN(
       BindingsAndMetadata result,
@@ -267,7 +270,7 @@
           /* public_headers= */ {"a.h"}, std::string(kTargetsAndHeaders),
           /* extra_rs_srcs= */ {},
           /* srcs_to_scan_for_instantiations= */ {},
-          /* instantiations_out= */ ""));
+          /* instantiations_out= */ "", /* error_report_out= */ ""));
   ASSERT_OK_AND_ASSIGN(BindingsAndMetadata result,
                        GenerateBindingsAndMetadata(
                            cmdline, DefaultClangArgs(),