BUG: Add type promotion support for eval() expressions with many properties

This commit modifies the call to numpy.result_type to get around the
NPY_MAXARGS limit, which at the moment is 32.  Instead of passing a
generator of all types involved in an expression, the type promotion
is done on a pair-wise basis with a call to reduce.

This fixes bugs for code such as the following:

    from numpy.random import randn
    from pandas import DataFrame

    d = DataFrame(randn(10, 2), columns=list('ab'))

    # Evaluates fine
    print(d.eval('*'.join(['a'] * 32)))

    # Fails to evaluate due to NumPy argument limits
    print(d.eval('*'.join(['a'] * 33)))