Finish the test's implementation.
This CL completes the implementation of the added test. As a means to that end, it adjusts sanitize_gcode (now sanitized_gcode) to return a results iterator instead of directly printing the results. This way the test code can analyze the results and the main program can continue to print the results.
Some functions are switched over to using Box<dyn Iterator<...>> references as they simplify and generalize the input/return values for many of our iterator manipulation functions.
Another small change is that the Result<String, std::io::Error> type is no longer propagated down the iterator chain. The error value is only useful in identifying i/o errors while reading the file, and so now we just panic on these when reading from a file enabling the rest of the iterator pipeline to work simply with Strings.