DenseVectorBase::empty(), const T & operator()

empty() adds a missing STL-like function.

Returning a reference in both const and non-const accessors lets us
easily pull out a valid T* for use in other APIs.
PetscVector<T>::insert specializations

If we have a whole N-vector of values to add, we can add them all with
1 PETSc call instead of N.
Refactor NumericVector::insert()

Add an insert() overload that takes const T* input; this now forms the
underlying implementation of several other overloads.

Move common insert() overloads into NumericVector rather than defining
them redundantly in subclasses; use a using declaration when necessary
to prevent this from leading to hidden overloads.

Make those less-raw overloads inline and non-virtual; particular
subclasses should find it sufficient to overload the T* method.
NumericVector::get refactoring

Added an API for get(T*), and refactored the get(vector<T>) API to be
an inline wrapper for it.
NumericVector::add_vector refactoring

Similar to #411 and #413

This was originally intended to be just another additional T* API plus
a refactoring; however, the new PetscVector::add_vector(DenseVector)
code path should be a performance improvement as well.