Build helper (build.rs glue)

The trivial helper crate (ethercat-esi-build (build.r... (BB_0064)) so downstream consumers run codegen with one build.rs invocation and one include! line.

Feature: Build helper (build.rs glue) FEAT_0055
status: open
satisfies: FEAT_0050
is satisfied by: REQ_0540, REQ_0541, REQ_0542, REQ_0543
is refined by: CON_0010, ARCH_0052, ADR_0076
is implemented by: BB_0064

A trivial helper crate so downstream consumers run codegen with one build.rs invocation and one include! line.

Requirement: Builder API shape REQ_0540
status: open
satisfies: FEAT_0055
is verified by: TEST_0440

ethercat-esi-build shall expose Builder::new().glob(<pattern>).backend(<backend>).out_file(<name>).build() returning Result<(), BuildError>. The backend parameter shall be generic over CodegenBackend per CodegenBackend trait shape (REQ_0510).

Requirement: Output written to OUT_DIR REQ_0541
status: open
satisfies: FEAT_0055
is verified by: TEST_0440

The helper shall write the generated module to $OUT_DIR/<out_file> so consumers wire it in with include!(concat!(env!("OUT_DIR"), "/<out_file>"));.

Requirement: Cargo rerun-if directives emitted per ESI input REQ_0542
status: open
satisfies: FEAT_0055
is verified by: TEST_0441

The helper shall print cargo:rerun-if-changed=<path> for each ESI file matched by the glob and for the build script itself, so cargo re-runs codegen exactly when an input changes — not on every build.

Requirement: Generated output passes through prettyplease REQ_0543
status: open
satisfies: FEAT_0055
is verified by: TEST_0442, TEST_0470

Before writing the output, the helper shall format the TokenStream via prettyplease::unparse so the file is human-readable when diffed or inspected through cargo expand.