Thinking and writing about mathematical structures in a way that is rigorous and precise. Working inside a particular mathematical structure, I have no trouble giving rigorous definitions, nor deciding whether or not a definition is rigorous. For example, working inside $\mathbb{Z}$:

Definition. Let us say that $x \in \mathbb{Z}$ is prime iff $x$ is non-zero, $x$ does not divide $1$, and for all $y,z \in \mathbb{Z}$, we have that if $x \mid yz$, then $x \mid y$
  or $x \mid z$.

So we've specified the meaning of "$x \in \mathbb{Z}$ is prime" without any serious ambiguity. However, in contexts that involve an "external" perspective on mathematical structures, I find it difficult to give truly rigorous definitions, or perhaps I just cannot tell which definitions are rigorous.
For a silly example:

Definition. Let $(G,*)$ and $(H,\diamond)$ denote groups. Then a homomorphism $(G,*) \rightarrow (H,\diamond)$ is a function $f : G \rightarrow H$ such that for all $g,g' \in G$, we have that $f(g*g') = f(g) \diamond f(g')$.

Notice that, according to the above definition, a homomorphism $(G,*) \rightarrow (H,\diamond)$ is a particular kind of function $f : G \rightarrow H$. I guess that, since $f$ is a function, or in other words, a $\mathbf{Set}$-arrow, this means that the domain and codomain of $f$ are sets, namely $\mathrm{dom}(f) = G$ and $\mathrm{cod}(f)=H.$ But (perhaps) I am imagining that the domain and codomain to be groups, so that $\mathrm{dom}(f) = (G,*)$ and $\mathrm{dom}(f) = (H,\diamond).$ So, has my definition truly captured the concept it was intended to? I don't know, but I find it slightly unsatisfying. And sure, there's more to mathematics than rigor and precision, but I like to have my cake and eat it: I like to be precise and intelligible.

Question. Does anyone know of an article purports to help you learn to think and write about mathematical structures in a way that is rigorous and precise?

 A: Well, as far as your actual example is concerned, your proposed definition seems quite sensible to me. You are trying to translate the following definition into natural language (more or less): given groups $(G,*)$ and $(H,\diamond)$,
$$
\mathbf{Grp}((G,*),\ (H,\diamond)):=\{((G,*),\ f,\ (H,\diamond)):\ (G,\ f,\ H)\in \mathbf{Set}(G,\ H)\ \wedge$$$$\wedge\ \forall g,g'\in G\ (f(g*g') = f(g) \diamond f(g'))\}
$$
In other words, you are specifically defining the category of groups as a concrete category. Note also that, if $((G,*),\ f,\ (H,\diamond))\in \mathbf{Grp}((G,*),\ (H,\diamond))$, there is no confusion at all about what its domain and codomain are. Indeed, the domain and the codomain of an arrow in $\mathbf{Grp}$ are functions 
$$
d_{\mathbf{Grp}},\ c_{\mathbf{Grp}}\colon Arr(\mathbf{Grp})\to Ob(\mathbf{Grp}),
$$ 
and one puts $d_{\mathbf{Grp}}(((G,*),\ f,\ (H,\diamond))):= (G,*)$ and $c_{\mathbf{Grp}}(((G,*),\ f,\ (H,\diamond))):= (H,\diamond)$, whereas, with obvious notations, $d_{\mathbf{Set}}((G,\ f,\ H))= G$ and $c_{\mathbf{Set}}((G,\ f,\ H))= H$. In other words, you are simply considering different couples of functions, when describing the domain and the codomain of $f$ as a morphism of groups or as a morphism of sets.
In addition to this, I would just like to mention that, actually, one can define groups and morphisms of groups in a completely internal way, as the objects and the arrows of the category of group-objects in the category (topos) $\mathbf{Set}$ (see here). Similarly, a whole bunch of algebraic structures (basically all the fundamental ones, like monoids, rings, partial orders, excluding apparently fields though - see here again) can be described as algebraic structures internal to $\mathbf{Set}$.
To conclude, even if I can not give you references to answer your question, I would say that, quoting you and looking at my personal experience, a way "to help you learn to think and write about mathematical structures in a way that is rigorous and precise" is simply that of trying to define those structures as suitable categories and work internally to them.
EDIT: as archipelago pointed out, there was a little bias in my previous definition of $\mathbf{Grp}((G,*),\ (H,\diamond))$ as:
$$
\mathbf{Grp}((G,*),\ (H,\diamond)):=\{f\in \mathbf{Set}(G,\ H):\ \forall g,g'\in G\ (f(g*g') = f(g) \diamond f(g'))\}.
$$
I have now fixed it in a way that should somehow work properly and have modified part of my original post accordingly. 
