### 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
}
        var columnNames = new ArrayList<String>(columns.length);
        var blocks = Arrays.stream(columns)
            .peek(b -> columnNames.add(b.name))
            .map(b -> b.builderWrapper.builder().build())
            .toArray(Block[]::new);
        return new Tuple<>(new Page(blocks), columnNames);
    }
    /**
     * Takes a csv String and converts it to a String array. Also, it recognizes an opening bracket "[" in one string and a closing "]"
     * in another string and it creates a single concatenated comma-separated String of all the values between the opening bracket entry
     * and the closing bracket entry. In other words, entries enclosed by "[]" are returned as a single element.
     */
    static String[] multiValuesAwareCsvToStringArray(String csvLine, int lineNumber) {
        var mvCompressedEntries = new ArrayList<String>();
        String previousMvValue = null; 
        StringBuilder mvValue = null;
        int pos = 0;          
        int commaPos;         
        while ((commaPos = csvLine.indexOf(",", pos)) != -1 || pos <= csvLine.length()) {
            boolean isLastElement = commaPos == -1;
            String entry = csvLine.substring(pos, isLastElement ? csvLine.length() : commaPos).trim();
            if (entry.startsWith("[")) {
                if (previousMvValue != null || (isLastElement && entry.endsWith("]") == false)) {
                    String message = "Error line [{}:{}]: Unexpected start of a multi-value field value; current token [{}], "
                        + (isLastElement ? "no closing point" : "previous token [{}]");
                    throw new IllegalArgumentException(format(message, lineNumber, pos, entry, previousMvValue));
                }
                if (entry.endsWith("]")) {
                    if (entry.length() > 2) {