Use thimble

WIP, with some review points so it doesn't get too off-track.
Non-blocking nitpick: Will be nice to use `internal_listener` variable name here to be consistent with `add_listener` implementation.