Fix span text splatting

When using `dsl.span(*["foo", "bar"])`, the last splat value was being assigned to the opts argument of `dsl.span`

The fix is to check if `opts` is a Hash. If it is, keep it. Otherwise push `opts` into the splat and set `opts` to an empty Hash.

As for the specs, I am not entirely sure if they are all required. 

Ref #541