Cross product

Before: `cross(Vector3, Vector3)` returned an `Array`
After: `cross(Vector3, Vector3)` returns a `Vector3`

Outer constructors were added to `VectorN` so that an appropriately-typed version of `VectorN` is created based on the type of the constructor arguments:

`VectorN(a::T)` returns a `VectorN{T}`

This allows functionality to match native Julia:

`cross(Array{Int8,1}, Array{Float32,1})` returns an `Array{Float32,1}`
`cross(Vector3{Int8}, Vector3{Float32})` returns a `Vector3{Float32}`