Fix return type of .+ and .- on Bool arrays

For example, now [true].+[true] is the same as [true]+[true], i.e. [2]
As for Arrays, this is obtained by special-casing Bools.
Rename the internal broadcast!_function

renamed as gen_broadcast_function, since its purpose is
different from the exported version
Broadcast elementwise comparison operators

Closes #5877

This also specializes broadcast! when the target is a BitArray
and adds an (unexported) bitbroadcast function which creates a
BitArray target rather then an Array.

Also, some comparison operations between AbstractArray{Bool} are
specialized if possible.
Broadcast .^ for BitArrays

also specialize Bool^Integer while at it
Broadcast ./ for BitArrays

simply by removing a method!
Broadcast .* for BitArrays

addresses #3171
Broadcast: use start/next for Arrays/BitArrays

introduces specialized versions of the broadcasting
core which use start/next instead of cartesian iteration.
Used when the arguments only involve Arrays or BitArrays.