Narrow the scope to load fewer objects

I believe this could load HostPath hashes for HostPaths on other sites, not
just the relevant one. It wouldn't have updated the Hits on those sites as
the Hits are scoped to the relevant site.
More efficiently update the related hits

Rather than fetching and instantiating each Hit that should be related to this
mapping, just send a single SQL UPDATE to update them all.
Update HostPaths, not just hits on Mapping create
Fix error when paging past end of hits

Someone might do this if they are guessing at the page numbers as a way of
navigating through a large list.
Move existing specs for View models

* were in a flat structure, needed to correspond to hits/mappings
Add a View::Mappings::Filter

* A starting point for getting too many fields out of MappingsController
* Encapsulates filtering and sorting, takes params and produces a
  mappings collection
Replace all the filter fields in the view

* Where they were, for example @incompatible_filter, change to
  @filter.incompatible?
* Tests mostly broken
Fix the tests

* Where @filter could be nil, use #try
* Unrecognised filter-by-types shouldn't count to Filter#active?
* Sorting by hits should count to Filter#active?
Move trailing slash to canonical_filter

* This was in the controller
* It didn't need to be, this is a job for the filter
Move tag filter_helpers to View::Mappings::Filter
Inline Filter#by_tag? and #by_tags?

* Use the collection methods #any? and #include? instead
Minor cleanups

* Didn't need a field for mappings
* consistency with local variable names in tag add/remove
Better comment for View::Mappings::Filter
Separate QS hash manipulation into own class
filter_by_type_path -> Filter::Query#by_type
remove_filter_by_type_path -> Filter::Query#remove_by_type
Move sort methods from helper

* To Filter::Query
Reorder View::Mappings::Filter fields

* Make it a little easier to see what's where at a glance
Filter knows about fields it needs to pass through

* Should enable last part of https://www.pivotaltracker.com/story/show/70586196, i.e
  "The non-JS version doesn't keep your parameters when you go back to the filter form"
Naming tweaks after discussion

* Query -> QueryParams (make clear it's not a DB query)
* with/without rather than add/remove