reichen is a word with an iridescent conceptual core. The literal meaning of reichen is to hand, to pass, but also to reach and also to spread, to span in the sense of to have a certain extension. (der Bereich is the area.)
See the following sentence as an example for the concept of reichen:
Der Baumstamm reicht über den Bach bis ans andere Ufer.
The tree trunk reaches across the creek, right unto the other shore.
The meaning to hand and to reach have a common semantic core which is the "bow" between one point and the other. On the one hand, the "bow" is formed by the movement of the hand during giving, on the other hand, the "bow" is formed by the spanning thing which connects two things, reaching from one to the other. (Sorry for being so metaphorical myself, I hope you get what I mean.)
The meaning to suffice is a figurative extension of that meaning to reach, to have an extension. reichen in the figurative meaning to suffice and reichen in the literal meaning to reach share the concept of to span, to stretch over in the sense of to cover.
Your assumption concerning reichen is wrong: It is not the case, that reichen would be used exclusively for countable things. A very common use case of reichen is the fixed phrase Es reicht! (It is enough! in the sense of It is too much now).
ausreichen can best be translated as to suffice, to be sufficient. That means, I'd say, it is relative to a certain purpose (which is not necessarily explicit, but at least implicit.). reichen can also be relative to an implied or explicit purpose, but I feel that with ausreichen the emphasis on that purpose is slightly stronger.
hinreichen is nearly only used to form an adjective from its present participle hinreichend. You would never say Das reicht völlig hin., but would always say Das reicht völlig aus. The use of hinreichen (as verb) is possible, but will always sound unidiomatic, I'd say. If its use would not be limited to this case, it would be more similar to ausreichen than to reichen.
In some fixed phrases, hinreichend is mandatory and could not be replaced without the loss of idiomacy. One of those fixed phrases is hinreichende Bedingung (sufficient condition) in logic.
To make your confusion even bigger, there is also the verb zureichen which means the same as ausreichen. Besides being used in dialect, it is used only used with the adjective from its present participle zureichend or the negated adjective unzureichend (insufficient), which differs from hinreichend by the fact, that hinreichend is not negatable (the word *unhinreichend does not exist). In case it is not negated, zureichend is rarely used, instead ausreichend or hinreichend would be used.
The verb genügen from the adjective genug (enough) also means to suffice. genügen differs from the other verbs by more positive associations: genügsam means frugal, modest, humble.
Maybe one can understand the slight difference between genügen and reichen best by an example. See the two sentences
Es genügt mir.
in contrast to
Es reicht mir.
While both could be translated as
It is enough for me.
the first sentence has the subtext "I am happy with what I got", whereas the latter can also be meant sarcastically and has the subtext "I cannot stand it anymore, it is too much for me."
This association of genügen is not necessary, though. So, genügen, especially if negated, can simply mean suffice. The verbal paraphrase of mark 6 in school (the worst mark) is ungenügend (insufficient). Besides that, genügen generally has a higher tone. It can nearly always be replaced by reichen, but then the sentence would loose some high tone. I try to make an example again:
Du genügst mir nicht.
You don't suffice my demands.
Du reichst mir nicht.
You are not enough for me.
In Saxonian dialect, and maybe also elsewhere, we also have langen as a synonym for reichen. This is interesting in some sense, because langen echoes the conceptual metaphor of reichen: langen is etymologically related to the adjectiv lang (long), so it beares the concept of stretching, spanning, too. jemandem eine langen is colloquial for to punch someone. The underlying concept here is that you reach out your hand to punch the other person. verlangen means to demand or to long, the underlying concept is again the outstretched hand. erlangen also means to gain, to reach, again the outstretched hand is part of the concept.
The literal meaning of langen is also to hand and the figurative meaning of langen to suffice is similar to that of reichen.