### 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/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/CsvTestUtils.java
TEXT(Object::toString, BytesRef.class),
        IP(
            StringUtils::parseIP,
            (l, r) -> l instanceof String maybeIP
                ? StringUtils.parseIP(maybeIP).compareTo(StringUtils.parseIP(String.valueOf(r)))
                : ((BytesRef) l).compareTo((BytesRef) r),
            BytesRef.class
        ),
        VERSION(v -> new Version(v).toBytesRef(), BytesRef.class),
        NULL(s -> null, Void.class),
        DATETIME(
            x -> x == null ? null : DateFormatters.from(UTC_DATE_TIME_FORMATTER.parse(x)).toInstant().toEpochMilli(),
            (l, r) -> l instanceof Long maybeIP ? maybeIP.compareTo((Long) r) : l.toString().compareTo(r.toString()),
            Long.class
        ),
        BOOLEAN(Booleans::parseBoolean, Boolean.class);
        private static final Map<String, Type> LOOKUP = new HashMap<>();
        static {
            for (Type value : Type.values()) {
                LOOKUP.put(value.name(), value);
            }
            
            LOOKUP.put("SHORT", INTEGER);
            LOOKUP.put("BYTE", INTEGER);
            
            LOOKUP.put("I", INTEGER);
            LOOKUP.put("L", LONG);
            LOOKUP.put("UL", UNSIGNED_LONG);
            LOOKUP.put("D", DOUBLE);
            LOOKUP.put("K", KEYWORD);