Expanded _view/type-year's value for _list/tabulate.
Changed _list/tabulate to send ids for ungrouped rows.

That happens if either one of group_level or group=true or reduce=true are part
of the query string. I've let send_fields decide what to do on its first call
and then stay with this decision.
Included union in _view/type-year.

If queried with group=true, the value changes to an object with the property
'one'. 'one' is a range-object that covers the time ranges of each document.
So, if it happens to translate to "07/2009-06/2010" and I want to have
documents from 2009-2010, I don't have to check each document individually.
If I ask for documents of 06/2010, however, the documents of this key must be
checked because there might be one from 09/2009 etc.
Added intersection of all document types to reduce value.

At the end of the day, the view should reduce for example "07/2010-06/2011" and
"2011-2012" to "2011-06/2011".
Because, if I want to see documents from 2011, that would intersect with
"2011-06/2011" and therefore so with every document of this group. Again,
individual document times don't need to be checked in this case.
Improved performance of pre-filter to _view/type-year.

I used value.one and value.all to get one set of keys that goes to
_list/tabulate/type-year and one that goes to _view/type-year (both with
reduce=false) directly:
- If options.time is isolated from value.one, we can skip all documents of this
  key.
- If options.time contains value.one, that means that no document time with
  this key could ever be isolated from options.time. We can throw in all these
  documents without any further checks.
- If value.all contains options.time, that means that every document time with
  this key has to intersect with options.time.
It takes advantage of a property of intersects() from lib/ranges:
intersects(r, []) == intersects([], r) == false
Removed quasi-filter item 'redo'.

I've never liked it and finally I can throw it away!!!
Changed _view/type-year to compile range intersection.

This is somehow quoted from ranges/intersects and sketches as such:
- get a range from a and a range from b,
- intersect ranges and ignore result, if it's empty,
- exchange the range with what's next in its stack, if it's left end lies above
  the other range's left end.
Rewrote filtered replication in the map page.

There was an occasional out-of-bounds error in there that I haven't understood
yet and now I am sick and tired of correcting that tiny little loop again and
again, so there's that.