How did it come about historically that っ preceding a sound would geminate it? Is it really a little つ or are they just near homomorphs?
This question should be broken into two different questions:
- When and how did small-tsu come to represent consonant gemination.
- When and how did consonant gemination (as represented by small-tsu) come to be in Japanese.
(For those who don't know the term: gemination simply means doubling of sounds, usually consonants. It's easy to get the sense once you see it comes from the same Latin root as Gemini).
The answer for the first question is simpler, and was already given: in historical kana usage, consonant gemination was originally represented either by a full-size つ or by another consonant that got elided (usually that would be く, as in 学校, which was written ガくカウ in old spelling, or き as in 石鹸, originally: セキケン). The small-tsu spelling is recent. It was used sometimes even in the 19th century to indicate that the sound got elided, if not earlier, but small kana letters became a standard only following the 1946 spelling reform.
The answer for the second question is trickier. I don't have any historical linguistics books that I can check to get a definite answer for when the change happened, but it couldn't be earlier than the Heian period, and it was probably earlier than the 17th century. The reason for the change was quite simple: it happened in places where the sounds く and つ were already pronounced without the vowel (as still happens today in words such a ドクター and いつか which are usually pronounced
From here, the process that happened is quite simple: in words like 学校 the gemination was already there once the vowel disappeared and the word was pronounced
[gakkou]. In words like 血気,
[ketuki] (you have to remember that つ was originally pronounced [tu]) became
[ketki] and the
/t/ became assimilated to
/k/, so in the end we got
There are also some cases where the gemination was not caused by an elided consonant, but from the elision of a long vowel (like 真赤 まあか which became 真っ赤 まっか) or just because speakers decided to make the word longer for emphasis or some other reason (that's what happened in きっと, which was originally きと). These spontaneous geminations still happen today.
The usage of the small tsu っ to be used officially as a geminate consonant can be traced back to the Japanese government in 昭和六一年七月一日 (July 1st 1986(I believe)). You can read the bulletin by the 文部科学省 (Ministry of Education, Culture, Sports, Science and Technology; MEXT) that discusses this:
例 はしって(走) かっき(活気) がっこう(学校) せっけん(石鹸＊)
Notice: When using "tsu" for a geminate constant, it should be written in small form as much as possible.
Since 「なるべき」 is more of "where feasible, as much as possible" versus something more strict such as 「必ず (without fail)」, it does suggest the ability for this rule to be broken. This would most likely be in the cases of showing usage previous to this notice.
It's like a つ that gets dropped. You see it often in compound words where the first part would end in つ by itself. e.g., 発見（はっけん）. 発 is pronounced はつ by itself. はつけん is a little bit uncomfortable to pronounce, so it becomes はっけん. There are at least dozens if not hundreds of examples that follow this pattern.
Edit This is not the only place that the small tsu comes up. As Tsuyoshi Ito points out, there are other patterns such as 学校 （がっこう） instead of がくこう and 作家（さっか） instead of さくか.
According to the Wikipedia page for 促音, it used to be a big つ, then was changed by law to a small one in the Heisei era. I'm not sure what the history of using つ to lengthen a sound is.
Edit Ah, like Brendan says, it's the つ that's trouble to pronounce made small. The Wikipedia page also says that it's small to differentiate it from a normal つ.