[Search] Refactor: separate generic model code from search

Create a new GenericModel class and put most of SearchModel code
there. Subclass SearchModel from GenericModel. Later we can use
GenericModel for BrowseModel as well, removing duplicate code.

No functional changes.

Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com>
[Model] Name column indexes

This makes it easier to change the model without breaking things outside
the model.

Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com>
[Model] stop fetching if all results have been fetched already

This will skip one useless search/browse call in some cases.

Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com>
[Model] Add "static rows" in the model

This allows inserting a static row into the model. It will be
inserted before the actual search/browse results. This is useful
for BrowseModel that wants to edd e.g. ".."-row for moving up a
directory

Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com>
[Browse] Use the GenericModel for Browse

This removes a lot of duplicate code and makes Browse perform as well
as Search.

Note that BrowseModels are discarded as soon as the view changes to
another "directory" (BrowseModel). Caching could be added later on.

Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com>
[Model] auto-load items also when max_items is not known

This mostly removes special casing for the servers that do not support
max_items: the code already works quite well for them.

Add GenericModel.length_is_known() so we can still do the most
efficient thing with better servers.

Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com>