Builtin functions should not have access to StepsContext
### Problem
Builtin functions must implement a `Run` function that is registered at startup:
```go
func Run(ctx context.Context, stepsCtx *runner.StepsContext) error
```
This is incorrect, as it gives each builtin access to steps that have run previously in a sequence of steps. Builtins should be isolated and not have visibility into the execution history of other steps.
### Expected Behavior
The `Run` function should accept an interface type instead of a struct pointer:
```go
func Run(ctx context.Context, stepsCtx SomeInterface) error
```
Care should be taken to only add methods to this interface that the builtin should have access to.
### Requirements
- All expressions should be expanded in the `stepsCtx` passed to a builtin
- A builtin should not be able to access previously run step results
- The interface should expose only the minimal set of methods needed for builtin execution
### Implementation
- Define a new interface type for the builtin context
- Refactor the builtin function signature to use the interface instead of `*runner.StepsContext`
- Ensure the interface does not expose methods that would allow access to other steps' results
- Pre-expand all expressions before passing context to builtins
issue