### 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
LOOKUP.put("S", KEYWORD);
            LOOKUP.put("STRING", KEYWORD);
            LOOKUP.put("TXT", TEXT);
            LOOKUP.put("N", NULL);
            LOOKUP.put("DATE", DATETIME);
            LOOKUP.put("DT", DATETIME);
            LOOKUP.put("V", VERSION);
        }
        private final Function<String, Object> converter;
        private final Class<?> clazz;
        private final Comparator<Object> comparator;
        @SuppressWarnings("unchecked")
        Type(Function<String, Object> converter, Class<?> clazz) {
            this(
                converter,
                Comparable.class.isAssignableFrom(clazz) ? (a, b) -> ((Comparable) a).compareTo(b) : Comparator.comparing(Object::toString),
                clazz
            );
        }
        Type(Function<String, Object> converter, Comparator<Object> comparator, Class<?> clazz) {
            this.converter = converter;
            this.comparator = comparator;
            this.clazz = clazz;
        }
        public static Type asType(String name) {
            return LOOKUP.get(name.toUpperCase(Locale.ROOT));
        }
        public static Type asType(ElementType elementType) {
            return switch (elementType) {
                case INT -> INTEGER;