Is a Repository part of an aggregate
No, completely separate
a vehicle by which the aggregate is persisted that belongs to the infrastructure layer?
Not quite this either.
The primary role of the repository is that it acts as a boundary between the application and the data. The original discussion of repositories in the blue book introduced repositories with collection semantics; the interface for the repository was the same that you would use if the data were simply being stored in an in memory collection.
Second, is it prudent to increase the complexity and maintainability of software to achieve readability, or is this counter conducive to the goal of DDD, as a whole?
Not "readability", so much as "communication"; see chapter 2 of the blue book
On a project without a common language, developers have to translate for domain experts.... Translation muddles concepts, which leads to destructive refactoring of code.... A project faces serious problems when its language is fractured....
The complexity, in this case, is complexity drawn from the domain -- we probably shouldn't be imagining that we can model a domain with a thousand subtly different concepts using one or two domain agnostic abstractions.
are you stating that you believe that sub-classing string for mere readability, despite the fact that it could result in hundreds of additional classes would be a prudent approach, given it would serve as a catalyst for common language
Certainly not subclassing, no. But I would advocate having a unique name (in code) for each of the unique concepts (in the domain), even when those concepts share common representations.
To choose a naive example, Time isn't Money, even in those cases where the underlying representation of both is a long.
Scott Wlaschin's Domain Modeling Made Functional includes an extended example. At one point, he models verified email address and unverified email address as explicitly different from one another; even though those both have underlying string representations, he still takes the step of creating a single case union type for each of them, to capture in code the fact that these two concepts are not substitutes for each other.
That "complexity" is really just aligning the code artifacts with the ubiquitous language of the domain experts.
Now, depending on which Blub you are coding in, there may be additional complexity in your code artifacts to create these distinct names; as Scott demonstrates, it's really straight forward in F#, but it may not be so straight forward in your usual working language. My feeling is that if your choice of language is introducing complexity in your modeling, then maybe you should first be looking to see if there is another language better suited to the task.