Move to an object based filter system

The new filter object properly encapsulates running a filter over a set
a different objects. For instance, if there were a RainBarrel object
that extended MapFeature you could do:

f = Filter(string, instance)

plots_that_match = f.get_objects(Plot)
rainbarrels_that_match = f.get_objects(RainBarrel)
Limit searches to a single object grouping

Searches can now use any map feature criteria and criteria from one
other type of model.

For instance:
   plot.length > 4
   plot.tree.diameter > 9

Is okay but:
   plot.length > 4
   rainbarrell.capacity < 9

Is not.
Extract helper method into model classes
Update eco benefits to be more modular

In particular, benefits are now provided by subclasses of
BenefitCalculator for both bulk and single item benefits.

The main gist is that each BenefitCalculator returns benefits scoped by
group. For instance, the tree benefit calculator may return:

{ 'plants':
   { 'stormwater': { 'value': 5, ... },
     'co2storage': { 'value': 9, ... }}}

The benefits system will then automatically merge keys that are the same
across groups. For example, if we add the ability to plant shrubs and
their eco benefits return:

{ 'plants':
   { 'stormwater': { 'value': 2, ... }}}

The summed benefit list (with the example tree and shrub) would be:

{ 'plants':
   { 'stormwater': { 'value': 7, ... },
     'co2storage': { 'value': 9, ... }}}
Add the plot eco benefit calculator to the plot model

Note that this would normally create a circular reference so we bury the
import in the class method
Update templates to use the new standardized benefit names

Previously we were using 'tree_benefits' and 'resource_benefits'. Now
all benefits are accessed from the 'benefits' dict via the group name.