Use argument dtype to inform coercion
Master:

```python
>>> import dask.dataframe as dd

>>> s = dd.core.Scalar({('s', 0): 10}, 's', 'i8')
>>> pdf = pd.DataFrame({'a': [1, 2, 3, 4, 5, 6, 7],
...                     'b': [7, 6, 5, 4, 3, 2, 1]})
>>> (pdf + s).dtypes
a    object
b    object
dtype: object
```

Head:

```
>>> (pdf + s).dtypes
a    int64
b    int64
dtype: object
```

This is more consistent with 0.20.3, while keeping the benefits from https://github.com/pandas-dev/pandas/pull/16821

Closes https://github.com/pandas-dev/pandas/issues/17767

---

I may play around with this a bit more. I feel like this is a bit too numpy specific, for example, adding a `DataFrame` and a `pa.Scalar` still fails:


```python
In [39]: x = pa.array([1])[0]

In [40]: df = pd.DataFrame({"A": [1, 2]})

In [41]: df + x
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/internals.py in eval(self, func, other, raise_on_error, try_cast, mgr)
   1292         try:
-> 1293             values, values_mask, other, other_mask = self._try_coerce_args(
   1294                 transf(values), other)

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/internals.py in _try_coerce_args(self, values, other)
    677             raise TypeError("cannot convert {} to an {}".format(
--> 678                 type(other).__name__,
    679                 type(self).__name__.lower().replace('Block', '')))

TypeError: cannot convert Int64Value to an intblock

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/ops.py in na_op(x, y)
   1199             result = expressions.evaluate(op, str_rep, x, y,
-> 1200                                           raise_on_error=True, **eval_kwargs)
   1201         except TypeError:

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/computation/expressions.py in evaluate(op, op_str, a, b, raise_on_error, use_numexpr, **eval_kwargs)
    210         return _evaluate(op, op_str, a, b, raise_on_error=raise_on_error,
--> 211                          **eval_kwargs)
    212     return _evaluate_standard(op, op_str, a, b, raise_on_error=raise_on_error)

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/computation/expressions.py in _evaluate_standard(op, op_str, a, b, raise_on_error, **eval_kwargs)
     63     with np.errstate(all='ignore'):
---> 64         return op(a, b)
     65

TypeError: unsupported operand type(s) for +: 'int' and 'pyarrow.lib.Int64Value'

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/internals.py in eval(self, func, other, raise_on_error, try_cast, mgr)
   1351         try:
-> 1352             with np.errstate(all='ignore'):
   1353                 result = get_result(other)

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/internals.py in get_result(other)
   1320                 result = func(values, other)
-> 1321             else:
   1322                 result = func(values, other)

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/ops.py in na_op(x, y)
   1225                     with np.errstate(all='ignore'):
-> 1226                         result[mask] = op(xrav, y)
   1227             else:

TypeError: unsupported operand type(s) for +: 'int' and 'pyarrow.lib.Int64Value'

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-41-a01bb1dd67a6> in <module>()
----> 1 df + x

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/ops.py in f(self, other, axis, level, fill_value)
   1263                 self = self.fillna(fill_value)
   1264
-> 1265             return self._combine_const(other, na_op)
   1266
   1267     f.__name__ = name

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/frame.py in _combine_const(self, other, func, raise_on_error, try_cast)
   3836         new_data = self._data.eval(func=func, other=other,
   3837                                    raise_on_error=raise_on_error,
-> 3838                                    try_cast=try_cast)
   3839         return self._constructor(new_data)
   3840

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/internals.py in eval(self, **kwargs)
   3375         return self.apply('where', **kwargs)
   3376
-> 3377     def eval(self, **kwargs):
   3378         return self.apply('eval', **kwargs)
   3379

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/internals.py in apply(self, f, axes, filter, do_integrity_check, consolidate, **kwargs)
   3269                                                  copy=align_copy)
   3270
-> 3271             kwargs['mgr'] = self
   3272             applied = getattr(b, f)(**kwargs)
   3273             result_blocks = _extend_blocks(applied, result_blocks)

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/internals.py in eval(self, func, other, raise_on_error, try_cast, mgr)
   1296             block = self.coerce_to_target_dtype(orig_other)
   1297             return block.eval(func, orig_other,
-> 1298                               raise_on_error=raise_on_error,
   1299                               try_cast=try_cast, mgr=mgr)
   1300

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/internals.py in eval(self, func, other, raise_on_error, try_cast, mgr)
   1357         except ValueError as detail:
   1358             raise
-> 1359         except Exception as detail:
   1360             result = handle_error()
   1361

~/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/internals.py in handle_error()
   1340             if raise_on_error:
   1341                 # The 'detail' variable is defined in outer scope.
-> 1342                 raise TypeError('Could not operate %s with block values %s' %
   1343                                 (repr(other), str(detail)))  # noqa
   1344             else:

TypeError: Could not operate 1 with block values unsupported operand type(s) for +: 'int' and 'pyarrow.lib.Int64Value'
```

Do we want that to work?