smarter bounds checking

BoundsError() made me sad (so I fixed it)

this adds argument information to intrinsic bounds checking operations, optimized to have no added impact on the runtime cost, in the common case of not having an error

lots of examples (because there's a lot of cases this handles):
```
julia> a,b,c = 1,2
ERROR: BoundsError(
  of (1,2)
  at index [3]
  )
 in indexed_next at /Volumes/Lion/Users/jameson/Documents/julia/usr/lib/julia/sys.dylib

julia> f(::Any, ::Any, ::Any, args...) = Any
f (generic function with 1 method)

julia> invoke(f, (Any, Any, Any), 1, 1, 1)
ERROR: BoundsError(
  of (Int64,Int64...)
  at index [3]
  )
 in typeinf at ./inference.jl:1393
 in typeinf_ext at ./inference.jl:1242

julia> [][1,2]
ERROR: BoundsError(
  of 0-element Array{Any,1}
  at index [1,2]
  )
 in getindex at no file

julia> [1,2][10]
ERROR: BoundsError(
  of 2-element Array{Int64,1}:
 1
 2
  at index [10]
  )
 in getindex at /Volumes/Lion/Users/jameson/Documents/julia/usr/lib/julia/sys.dylib

julia> [1,2][10,10]
ERROR: BoundsError(
  of 2-element Array{Int64,1}:
 1
 2
  at index [10,10]
  )
 in getindex at no file

julia> f(x) = (a=1+2im; a.(x))
f (generic function with 2 methods)

julia> f(4)
ERROR: BoundsError(
  of 1 + 2im
  at index [4]
  )
 in f at no file

julia> f(x) = (a=(1,2.,""); a[x])
f (generic function with 2 methods)

julia> f(4)
ERROR: BoundsError(
  of (1,2.0,"")
  at index [4]
  )
 in f at no file

julia> f(x) = (a=(1,2.); a[x])
f (generic function with 2 methods)

julia> f(4)
ERROR: BoundsError(
  of (1,2.0)
  at index [4]
  )
 in f at no file

julia> f(x) = (a=(1,2,4,6,7); a[x])
f (generic function with 2 methods)

julia> f(30)
ERROR: BoundsError(
  of (1,2,4,6,7)
  at index [30]
  )
 in f at no file

julia> f(x) = (a=IOBuffer(); a.(x) = 3)
f (generic function with 2 methods)

julia> f(30)
ERROR: BoundsError(
  of IOBuffer
  at index [30]
  )
 in f at no file

julia> f(x) = (a=IOBuffer(); a.(x))
f (generic function with 2 methods)

julia> f(30)
ERROR: BoundsError(
  of IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)
  at index [30]
  )
 in f at no file

julia> f() = (a=IOBuffer(); a.(100))
f (generic function with 3 methods)

julia> f()
ERROR: BoundsError(
  of IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)
  at index [100]
  )
 in f at no file

julia> f() = (a=1+2im; a.(100))
f (generic function with 3 methods)

julia> f()
ERROR: BoundsError(
  of 1 + 2im
  at index [100]
  )
 in f at no file

julia> f() = (a=(1,2,3); a[100])
f (generic function with 3 methods)

julia> f()
ERROR: BoundsError(
  of (1,2,3)
  at index [100]
  )
 in f at no file

julia> f() = (a=[1,2,3]; a[100])
f (generic function with 3 methods)

julia> f()
ERROR: BoundsError(
  of 3-element Array{Int64,1}:
 1
 2
 3
  at index [100]
  )
 in f at no file

julia> [][]
ERROR: BoundsError(
  of 0-element Array{Any,1}
  at index [1]
  )
 in getindex at no file

julia> (1,2,3)[100]
ERROR: BoundsError(
  of (1,2,3)
  at index [100]
  )
 in getindex at /Volumes/Lion/Users/jameson/Documents/julia/usr/lib/julia/sys.dylib

julia> (1,2,3.)[100]
ERROR: BoundsError(
  of (1,2,3.0)
  at index [100]
  )
 in getindex at /Volumes/Lion/Users/jameson/Documents/julia/usr/lib/julia/sys.dylib

julia> (1,2,3.,"4")[100]
ERROR: BoundsError(
  of (1,2,3.0,"4")
  at index [100]
  )
 in getindex at /Volumes/Lion/Users/jameson/Documents/julia/usr/lib/julia/sys.dylib

julia> (1+2im).(100)
ERROR: BoundsError(
  of 1 + 2im
  at index [100]
  )

julia> error(BoundsError())
ERROR: BoundsError()
 in error at no file

julia> error(BoundsError(Int))
ERROR: BoundsError(
  of Int64
  )
 in error at no file

julia> error(BoundsError(Int, 10))
ERROR: BoundsError(
  of Int64
  at index [10]
  )
 in error at no file

julia> error(BoundsError(Int, (:a,)))
ERROR: BoundsError(
  of Int64
  at index [a]
  )
 in error at no file
```

ref https://github.com/JuliaLang/julia/issues/9520
ref https://github.com/JuliaLang/julia/issues/6297
ref https://github.com/JuliaLang/julia/issues/7978
ref https://github.com/JuliaLang/julia/issues/4744