Support for multi-value and nested searches

When a `.search()` keyword argument is an array, use a terms filter
instead of the singular term.

When a `.search()` keyword argument is an object, use it verbatim
as a nested query on the path of the keyword. The mapping for the
class is consulted to determine the depth at which the nested object
begins and the query is adjusted to have a proper nested clause.

With these changes, the `Document` lookup helpers are not necessary.
Instead, `Annotation` now expands the aliases easily by using the
nested search capabilities.