Clean up utils.page_resolver logic

get_page_queryset_from_path now always returns a queryset, previously it
was capable of returning a PageQuerySet, Page model or None, which both
the callers had to hack around. Also simplified the logic internally,
while taking care to preserve behavior:

* Querying for "home" is unnecessary if path is provided
* Handling IndexError/DoesNotExist is unnecessary, now we return a
  queryset with 0...1 results
* get_page_from_path docstring lies about "Raises exceptions is page
  does not exist"
Avoid query for uncommon case where CMS roots are not visible

This saves a database query from every CMS page load. Originally
introduced in commit 61f56dd14751bab4c0232a62afb87555216a67f4 with no
rationale. These are the edge cases where it makes a difference, as far
as I can tell:

* It forbids seeing published subpages when all roots are unpublished.
  But why the special treatment of roots and not caring about other
  intermediary levels? And it checks for any roots regardless of
  placement, even if it's in a different hierarchy.
* It prevents seeing a draft version of a page if there are no draft
  versions of any root pages in the site. If that's at all possible, it
  seems like a bug?