Fix # web users graph

fixes http://manage.dimagi.com/default.asp?144599#805971

reimplements a broken query
@nickpell good point about `list('abcd')`, I'd forgotten about that, although you could just do a smart conversion.  The `domain` function calls the [`terms` filter](https://github.com/dimagi/commcare-hq/blob/master/corehq/apps/es/filters.py#L5-L13) which already accepts either a list or a singleton:
```python
if isinstance(value, list):
    return {"terms": {field: value}}
else:
    return {"term": {field: value}}
```
Although as @twymer pointed out, this isn't super obvious by the name.  I think I prefer keeping it like this though.   You can think of it as "the domain from the doc returned should match this list or singleton", in which case the singular "domain" is from the individual source docs, not the query.  ie `forms_query.domain(matching_domains)`.

The alternative is either a whole bunch of essentially duplicate functions for every terms filter, or a bunch of filters named "domain_or_domains" or "user_id_or_user_ids".  Neither of which is particularly compelling.  Happy to hear suggestions for a concise, intuitive naming convention if you've got 'em though.

If the concern is for other iterables that aren't lists, we could change `isinstance(value, list)` to something super generic like `hasattr(value, "__iter__")` which will also return `True` on tuples and iterators (but still return `False` on strings), then coerce to a list.