General comment on `GeometryPipeline`.  Is there a reason that some functions throw for the incorrect primitive type or lack of data (such as missing  indices here) and others simply perform a no-op?  Why not just have them all perform a no-op or all throw?  It makes the API confusing to have two different behaviors unless there's a very clear reason for it.