fill!: convert value once, fix fill!(Array(Float64,1),-0.0)

Previously, this erroneously returned an array filled with +0.0.

The fill value is now converted a single time when it doesn't match
the type of the Array, and then filled in via specialized methods
which only apply when the element type of the array and the fill
value's type are the same.