Prevent computations in float16 in scalar and elemwise

Also add a bunch of tests
Yes, we could make sure that the result of each call to `impl` gets casted to a numpy scalar type, but it looks like a hassle, and could even slow down the execution.