This just puts the viewport stuff together.
Recoded traversing the viewport stack.

This does exactly the same thing but I need the index later.
Changed update_items to extend the last viewport.

The last viewport can only be extended if only one vp was removed from the
stack and if the list("bbox-filter/bbox") returned the same items.
I still could construct a scenario where these conditions would result in a bad
viewport, perhaps if limit=1 and we have a large item and a larger item in the
middle of the first one. The larget item would have to cover lots of vertical
space but almost no horizontal one. Then the user has to move the map really
fast from one side to the other. Etc.
Added pad to the viewport stack.

pad is a bit tricky: it touches the most outer border of all the displayed
geometries' bboxes borders directing to the center. So, as soon as pad lies
outside of the viewport, we can assume the same for one or more of the
displayed geometries.
Inversely, we can skip the geometry update as long as it's inside.
Calculated viewport.pad.

Gaah it looks messed up but it must be this way:
- viewport.pad is a bounding box and therefore pad[0]<=pad[2] and
  pad[1]<=pad[3].
- The bottom-left edge of pad is assigned to the top-right edge of the bounding
  boxes that lies most bottom-left.
Simplified _list/bbox-filter query using viewport pad.

The list is constructed in a way that I can remove bbox from options without
causing it to crash.
Added new vieport unconditionally.
Directed extend_vp to the right viewport.
Installed limited query to _spatial/bbox.

As it says, response is limited to 50kb, and as soon as there seems to be an
overflow of the amount of geometries, I reverted to _list/bbox-filter/bbox.
After all it isn't that bad.
Avoided array concatenation if it isn't really needed.

Unfortunately I haven't figured out what to do with the spatial response if an
overflow occured. Right now it is just ignored.
Removed lazy viewport update.

Until I've figured something out, it seems like waaay too much work to make
that thing function with the viewport model.