Improve flexiblity of GeometricBoundaryField evaluate
The primary change is to expose the communication type is exposed as a parameter to allow for more tuning and better reuse independent of any defaultCommsType value. However, provide as the default parameter of defaultCommsType so there is no change in behaviour for any existing code.
The new evaluate_if() method supports a general selection predicate, which will help us avoid writing/rewriting specialized evaluation methods in the future (can just use a lambda).
In addition to the boundary field handling, also cleanup some of the DimensionedField and GeometricField I/O and replace demand-driven-data in GeometricField with unique_ptr.