Renamed `str` to `src` and change how it operates on strings

It's more accurate to call this `src` than `str` since its
purpose is to return a source code representation of the
object, rather than just the `toString` representation.
There's obvious and significant overlap with JSON, but the
purpose of `src` isn't to produce valid JSON, but valid JS.
Added `thunk`