[enh] Issue 8948 - Make error message more readable for function/delegate errors

This is a reimplementation of Pull #1248 which wasn't good because it was breaking IDE tools.

This pull keeps the error message on one line, but also prints additional information for several distinct cases:

- Mismatching parameter length (when length is greater than 1):

    ```D
    void function(int, float, int) a;
    void function(int) b;
    b = a;
    ```

    ```
    Error: cannot implicitly convert expression (a) of type 'void function(int, float, int)' to 'void function(int)': Parameter count mismatch (3 vs 1)
    ```

- Mismatching parameter length (when length is equal to 1):

    ```D
    void function(int, float) a;
    void function(int) b;
    b = a;
    ```
    ```
    Error: cannot implicitly convert expression (a) of type 'void function(int, float)' to 'void function(int)': Missing extra parameter #2 ('float')
    ```

- Mismatching parameter type when lengths are equal:

    ```D
    void function(int, float) a;
    void function(int, int) b;
    b = a;
    ```

    ```
    Error: cannot implicitly convert expression (a) of type 'void function(int, float)' to 'void function(int, int)': Type mismatch at parameter #2 ('float' vs 'int')
    ```

- Mismatching parameter type when lengths are not equal:

    ```D
    void function(int, float, string) a;
    void function(int, string) b;
    b = a;
    ```
    ```
    Error: cannot implicitly convert expression (a) of type 'void function(int, float, string)' to 'void function(int, string)': Parameter #2 ('float') is missing
    ```

- Mismatching calling convention (linkage):

    ```D
    extern(C++) void function(int) a;
    extern(C) void function(int) b;
    b = a;
    ```

    ```
    Error: cannot implicitly convert expression (a) of type 'extern (C++) void function(int)' to 'extern (C) void function(int)': Linkage mismatch ('C++' vs 'C')
    ```

- Mismatching return type:

    ```D
    int function(int) a;
    float function(int) b;
    b = a;
    ```

    ```
    Error: cannot implicitly convert expression (a) of type 'int function(int)' to 'float function(int)': Return type mismatch: ('int' vs 'float')
    ```

Of course more cases could be added, for example mismatch of `pure` and `system` functions. I didn't add such a case because I know very little about purity and other such attributes, but it can easily be added by another pull from someone who knows how to deal with those.