RFC: Preserve type on integer arithmetic

This is my try to make `Int8 + Int8 = Int8`. It would fix #3759 which now has the 0.4-projects tag indicating that there is hope that this gets accepted :-)

I had to fix some tests and the unicode test still fails with

    exception on 2: ERROR: test failed: utf8(u16) == u8
It is frequently correct. However, sometimes, such as when interacting with ccall or other IntrinsicFunctions, it is probably not. For example, the following method match was probably not expected by the author:
```
julia> @which convert(Union(Int32, Int64), float16(2))
convert{T<:Integer}(::Type{T<:Integer},x::Float16) at float16.jl:103
```

And the author almost certainly was not expecting this:
```julia
a = Array(Union(Float32,Float64),1)
@which copy!(a,1:1,a,1:1)
copy!{T<:Union(Float32,Complex{Float64},Float64,Complex{Float32}),Ti<:Integer}(dest::Array{T<:Union(Float32,Complex{Float64},Float64,Complex{Float32}),N},rdest::Union(UnitRange{Ti<:Integer},Range{Ti<:Integer}),src::Array{T<:Union(Float32,Complex{Float64},Float64,Complex{Float32}),N},rsrc::Union(UnitRange{Ti<:Integer},Range{Ti<:Integer})) at linalg/blas.jl:828
```

generally, these eventually get caught somewhere else before turning into a ccall parameter.

@tknopp `x::Int32` asserts that x is of type 32-bit integer. `x::Type{Int32}` asserts that x is `Int32`, the type of a thing that is a 32-bit integer.