### Description

Evals that introduce aliased can be simplified by extracting them into a project (and thus signaling there's no underlying processing).

The following eval:
`eval x = a + 1, y = x, z = y + 1, y = z, w = y + 1`
can be converted into:
`eval x = a + 1, z = a + 1 + 1, w = a + 1 + 1 | project x, z, z as y, w`

This helps fuse the project with other projections/aggs downstream.
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java
assertThat(stat.type(), is(StatsType.COUNT));
        assertThat(stat.query(), is(QueryBuilders.existsQuery("emp_no")));
    }
    /**
     * Expects - for now
     * LimitExec[500[INTEGER]]
     * \_AggregateExec[[],[COUNT(hidden_s{r}#8) AS c],FINAL,null]
     *   \_ExchangeExec[[count{r}#25, seen{r}#26],true]
     *     \_AggregateExec[[],[COUNT(hidden_s{r}#8) AS c],PARTIAL,8]
     *       \_EvalExec[[salary{f}#20 AS s, s{r}#3 AS hidden_s]]
     *         \_FieldExtractExec[salary{f}#20]
     *           \_EsQueryExec[test], query[{"esql_single_value":{"field":"emp_no","next":{"range":{"emp_no":{"lt":10050,"boost":1.0}}}}}]
     *             [_doc{f}#42], limit[], sort[] estimatedRowSize[16]
     */
    
    public void testCountFieldWithEval() {
        var plan = plan("""
              from test | eval s = salary | rename s as sr | eval hidden_s = sr | rename emp_no as e | where e < 10050
            | stats c = count(hidden_s)
            """, IS_SV_STATS);
        var limit = as(plan, LimitExec.class);
        var agg = as(limit.child(), AggregateExec.class);
        var exg = as(agg.child(), ExchangeExec.class);
        agg = as(exg.child(), AggregateExec.class);
        var eval = as(agg.child(), EvalExec.class);
    }
    
    public void testCountOneFieldWithFilter() {
        var plan = plan("""
            from test