This was almost certainly my fault, but as I look at the implementation of Sets.cartesianProduct, I think its `contains` method made the assumption that `ImmutableSet.asList().indexOf` was O(1), which is no longer the case for Android.  It should probably get a specific `contains` implementation that actually is O(sets), not O(sets*setSize).
static class DescendingSet<E> extends ForwardingNavigableSet<E> {
    private final NavigableSet<E> forward;
    DescendingSet(NavigableSet<E> forward) {
      this.forward = forward;
    }
    @Override
    protected NavigableSet<E> delegate() {
      return forward;
    }
    @Override
    public E lower(E e) {
      return forward.higher(e);
    }
    @Override
    public E floor(E e) {
      return forward.ceiling(e);
    }
    @Override
    public E ceiling(E e) {
      return forward.floor(e);
    }
    @Override
    public E higher(E e) {
      return forward.lower(e);
    }
    @Override
    public E pollFirst() {
      return forward.pollLast();