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
these have an oddity (shared with many BLAS methods) that they don't specify quite what you intended, which could lead to incorrect answers / incorrect dispatch, since the type signature `Type{TypeVar(:T, Signed64)}` also matches any union-of-types Type. For example:
```julia
julia> Type{Union(Int8,Int16)} <: Type{TypeVar(:T,Base.SmallSigned)}
true
```

Instead, what you really want is:
```julia
typealias Signed64Types Union([Type{T} for T in Signed64.types]...)
convert{T<:Signed64Types}(::T, x::Float32) = ...
```

(this change also needs to be made to many of the BLAS/linalg functions in base – replacing `Type` with `Array` – to avoid dispatching to the wrong method)