Rework SparsityMap to DecoratedMap

To apply implicit (extruded top and bottom boundary conditions) to Maps,
we need to record whether such a bc should be applied to the current
Map.  We can't modify the Map itself, since it may need to be used in
unmodified form.  Instead, rework the SparsityMap object to a more
general DecoratedMap that allows us to attach arbitrary data to a Map,
and use it to store both the iteration_region of a Map (for building
sparsities) and any implicit boundary conditions that may need to be
applied.
Reimplement top and bottom bcs for Mat assembly in extruded

Now that the Maps themselves keep track of whether any implicit boundary
conditions are to be applied, we can add back the code generation that
places negative values in the maps and do so on a map-by-map basis.
This means that we only apply bcs to the relevant part of a MixedMap.