Fix issues in determining return type of sum/prod along dim

- Fix reductions along dimensions of heterogeneously typed arrays
- `sumabs` and `sumabs2` for `Complex64`/`Complex128` should return `Float32`/`Float64`

cc @lindahua, @stevengj
This sucks. Using `method_exists` doesn't work for `Array{Union(Float32,Float64)}` because `zero(Union(Float32, Float64))` [exists](https://github.com/JuliaLang/julia/blob/master/base/number.jl#L47) but throws on `convert`. Any better ideas?