Because we have separate callbacks for symbolic and numeric batches, `_validate` must know which callbacks to call. The `restrict_batch` method above calls `_validate`, and therefore must choose whether it'll call `validate(is_numeric=True)` or `validate(is_numeric=False)`. This is somewhat awkward, since there's no reason `restrict_batch()` should be limited to just numeric or just symbolic batches. Since the master branch calls has it call `validate` and not `np_validate`, I preserved that historical behavior by calling `_validate(is_numeric=False)`. 

One solution would be to allow a third option, `_validate(is_numeric=None)`. This means that the numericness of the batch is inferred from the batch itself, as in the first version of this PR. If the batch is `()`, then both numeric and symbolic callbacks will be called on it.

Should I do this, or should I leave `restrict_batch()` to limited to symbolic batches?  Another option would be to give restrict_batch a `is_numeric` argument to let the caller choose which validate callbacks to call on it.