Modifying Dirichlet_O2 and Neumann_O2 boundaries

If no boundary condition value was specified,
e.g. in input file if boundary was "bndry_all = dirichlet_o2"
then a segfault would occur if neither field generator nor
boundary function had been set.

These two boundary conditions use the following:

o If a boundary generator has been set in the input
  (e.g. "dirichlet( expression )" )
  then use that to set the boundary values.

o If no generator set, then look for a boundary function

o If no generator or boundary function, then use zero for
  the value (Dirichlet) or gradient (Neumann).

User-supplied boundary functions are wrapped in a FieldGenerator
in field_data.cxx, simplifying the interface.

Looking for generators and functions is done once at the beginning
of the applyBoundary methods, but this still results in an "if"
statement inside the loop setting the boundary condition. Not ideal
for performance.