Atomic arb cycle. Caller specifies the route; contract just orchestrates.
User's tx signature authorizes:
Returns the principal_token balance delta (must be >= min_amount_out or the transaction reverts).
fn cycle_swap(
env: soroban_sdk::Env,
user: soroban_sdk::Address,
principal_token: soroban_sdk::Address,
amount_in: i128,
min_amount_out: i128,
hops: soroban_sdk::Vec,
) -> i128