Add search features

This patch adds the following:
    * model introspection for search directives
    * inequality search operators
    * explicit strict equality and fuzzy equality search operators
    * quoted search terms for the left hand side of directives
    * refactored test code

Users can now specify what field on a model they want to search. The
syntax for specifying the field is shared with how django annotates
searches in Q objects (using '__' to specify traversing to a related
model.)

For example, say a user wanted to filter on systems with the status
'production'. They can now search:

    sys.system_status__name='production'

Internally, the compiler will parse the rhs and attempt to verify that
'system_status' corresponds to a relational field on the 'sys' (System)
class and that the model referenced by 'system_status' (SystemStatus)
has a field 'name'. If things checkout the compiler will pass along a Q
object for filtering systems that looks like:

    Q(**{"system_status__name": "production"})

The following query is now supported:

    sys.hostname~admin1 sys.server_model__vendor~HP \
        sys.purchase_date>=2014-01-01 sys.notes="/foo ba[zr]"

This search does a fuzzy search for systems with "admin1" in their
hostname, selects for servers who's server model is supplied by vendors
with "HP" in their name, were purchased after (or equal to) January 1st
2014, and that also have a notes field that match the regular expression
"foo ba[zr]"