You can nest context expressions when you want to access keys (or secrets, integrations, etc.) in an event or a step output using another dynamic key value.
For example:
{{ $.step_1.{{ $.step_2.key_2 }}.inner_key_2 }}
You can also refer to integration values and secrets by dynamically providing their names, like so:
{{ $.integrations.{{ $.some_step.required_integration_name }}.some_value_from_the_integration }}