Use thimble

WIP, with some review points so it doesn't get too off-track.
Nope; the `arguments` of `bound_args` unfortunately means "all arguments", not just positional ones; it contains all bound arguments by name:

```py
>>> import funcsigs
>>> def foo(a, b, c=1):
...     pass
...
>>> funcsigs.signature(foo).bind(1, b=2)
<funcsigs.BoundArguments object at 0x109cf19d0>
>>> _.arguments
OrderedDict([('a', 1), ('b', 2)])
```