First, to your very first claim. Neither $\frac{\mathrm{d}f(x)}{\mathrm{d}x}$ nor $f'$ are primary, the definition of the derivative is primary and all notations are shorthand references to that definition. Notation cannot be rigorous because notation is just syntax. Reasoning about the semantics of the objects described by syntax can be rigorous, but the syntax is just strings of symbols having whatever semantics we have defined them to have. Since we give the string of symbols "$\frac{\mathrm{d}f}{\mathrm{d}x}$" semantics, that string of symbols has that meaning. That string of symbols also makes it easier to communicate precisely about rigorous reasoning about the abstract process that string of symbols labels.
Additionally, there is a property of equality. If the equality $A = B$ holds, then in any expression, anywhere $A$ appears, it may be replaced with $B$ and vice versa. So, once we have $y = f(x)$, then \begin{align*}
D_x(y) &= D_x(f(x)) \text{,} \\
\partial_1 y &= \partial_1 f(x) \text{,} \\
y' &= \left( f(x) \right)' = f'(x) \text{,} \\
y^{(1)} &= \left( f(x) \right)^{(1)} = f^{(1)}(x) \text{,} \\
\frac{\mathrm{d}y}{\mathrm{d}x} &= \frac{\mathrm{d}f(x)}{\mathrm{d}x} \text{, and} \\
\frac{\partial y}{\partial x} &= \frac{\partial f(x)}{\partial x} \text{.}
\end{align*}
Further, if we are working in calculus of a single variable, the above list of equivalences are also equivalent to $D(y) = D(f) = \partial_1 f = f' = f^{(1)} = \frac{\mathrm{d}f}{\mathrm{d}x} = \frac{\partial f}{\partial x}$, for the reason that in the calculus of a single variable, functions can only have one argument, so differentiation is with respect to that argument.
You say "the $\frac{\mathrm{d}}{\mathrm{d}x}$ must be followed by a literal expression dependant on $x$, not by a function." However, a literal expression dependent on $x$ does denote a function dependent on $x$. "$x^2$" is a function, dependent on $x$, that squares its argument. Further, the operator "$\frac{\mathrm{d}}{\mathrm{d}x}$" need only be followed by something that can be differentiated with respect to $x$. If we have "$y = f(x) = x^2$", then $y$, $f$, and $x^2$ are all functions depending explicitly on $x$. Consequently, the strings of symbols "$\frac{\mathrm{d}}{\mathrm{d}x} y$", "$\frac{\mathrm{d}y}{\mathrm{d}x}$", "$\frac{\mathrm{d}}{\mathrm{d}x}f(x)$", "$\frac{\mathrm{d}f(x)}{\mathrm{d}x}$", "$\frac{\mathrm{d}}{\mathrm{d}x} x^2$", and "$\frac{\mathrm{d} x^2}{\mathrm{d}x}$" all denote the same operation.
You write "[in "$y = f(x)$", $y$ is] neither a function (because it equals $f$ evaluated at $x$) nor a constant number (because it depends on $x$)". However, you can't have it both ways. Either $y$ is evaluatable for various values of $x$ or $f(x)$ is not. The equality establishes that the value on the left of the equation equals the value on the right of the equation. The expression on the right of the equation, "$f(x)$", evaluates when $x$ has a value. Consequently, $y$ evaluates when $x$ has a value.
The problem you are not exactly stating, which is "how do I know what the independent variable is if all I see is '$f$'?" is exactly the same problem one has with any partial derivative and can be made worse by using notation badly. What's $\frac{\partial f(x,x,x)}{\partial x}$? The meaning of that expression is not communicated clearly by that expression in isolation ... because the "$x$" in the $\partial x$ is required to be either the label of a formal parameter when the function $f$ was declared or is required to be the label of one argument in "$\partial f(x,x,x)$". You recite the notation $\partial_1 f$, which is frequently also given the notations $\partial_1 f = f_1 = f^{(1,0,0)}$ to improve the situation, to explicitly enumerate the formal parameter that is treated as the independent variable (and in the latter two notations I recite, to allow multiple derivatives without excessive repetition of the symbol "$\partial$").
Consequence: Leibniz notation is unambiguous when the function appearing in the "change of output" portion of the simplified difference quotient that is the notation $\frac{\mathrm{d}f}{\mathrm{d}x}$, is either nullary or unary, i.e. has zero or one formal parameter. Certainly, if $g$ is declared $g(y,z)$ then $\frac{\mathrm{d}g}{\mathrm{d}x}$ has the same problem that partial differentiation of $g$ with respect to $x$ has. However, $\frac{\mathrm{d}g(x,x)}{\mathrm{d}x}$ has no such ambiguity and has a definite value, unlike when we notate partial differentiation. This is one of the few places where explicitly listing the parameters to the function in the "top" of a derivative usefully communicates something.
You say "...one of the big problems with Leibniz notation: it requires assigning fixed letters to the variables of a function, which is bogus since a function should be independent of the name given to its argument." This leaves you in a tight spot. Either you should be able to provide precise notation for a function that doesn't make a choice of formal parameter, for instance, you should be able to express $f(x) = x^2$ without any recourse to "$x$" or an equivalent, or you make a very clear argument that function definitions requires a choice of formal parameter. If we choose to be imprecise about the formal parameter, then $\frac{\mathrm{d}f(x)}{\mathrm{d}t}$ suddenly becomes semantically valid -- it's the derivative of the $f$ with respect to its only formal parameter, but it is ambiguous whether we intend to express the result in terms of the formal parameter $x$ or the formal parameter $t$.
In comments to the Question, you write "Moreover, $\frac{\mathrm{d}f(x)}{\mathrm{d}x}$ for $f′(x)$ is also bizarre because that would imply writing $f′(0.5)$ as $\frac{\mathrm{d}f(0.5)}{\mathrm{d}0.5}$" is only valid if you make the same error in both "$f′(0.5)$" as "$\frac{\mathrm{d}f(0.5)}{\mathrm{d}0.5}$". In "$f'(0.5)$", there is the potential ambiguity: are you differentiating $f$ and then evaluating the resulting derivative function at $0.5$, or are you evaluating $f$ at $0.5$, obtaining a constant (hence constant function), then differentiating that to obtain $0$. The latter is useless, so no person communicating something worthwhile ever uses notation to express that process -- differentiate first. Additionally, $\frac{\mathrm{d}f}{\mathrm{d}x}$ is a function, so there should never be any confusion that $\frac{\mathrm{d}f}{\mathrm{d}x}(0.5)$ has the semantics $\left. \frac{\mathrm{d}f}{\mathrm{d}x}\right|_{x=0.5}$, that is, differentiate, then specialize the value of the argument, yet another argument in favor of the notation you seem to dislike.