getDiscoveredThrowingType

calculateArgumentBindings

Do as much work as we can as part of the set-up so that argument binding
on subsequent advice invocations can be as fast as possible.

If the first argument is of type JoinPoint or ProceedingJoinPoint then we
pass a JoinPoint in that position (ProceedingJoinPoint for around advice).

If the first argument is of type JoinPoint.StaticPart
then we pass a JoinPoint.StaticPart in that position.

Remaining arguments have to be bound by pointcut evaluation at
a given join point. We will get back a map from argument name to
value. We need to calculate which advice parameter needs to be bound
to which argument name. There are multiple strategies for determining
this binding, which are arranged in a ChainOfResponsibility.