Allow for more complicated custom tag searches.

Tags are logically AND'ed together, so a search for "foo, bar" will
return all devices that have both tags "foo" and "bar".  Tags can be
negated as well by including a "!" before the tag.  Negated tags are
also logically AND'ed.  Thus, a search for "foo, !bar, quux" will return
devices that have tags "foo" and "quux", but not "bar".

Tags are delimited by commas (since a tag can include spaces, such as
"fast server").  Whitespace is trimmed from the beginning and end of
each tag that is looked for.