In mathematical research articles and books, theorems and proofs are among the most common elements, but authors also use many others that fall in the same general class: lemmas, propositions, axioms, corollaries, conjectures, definitions, remarks,, cases, steps, and so forth. As these elements form a slice of the text stream with well-defined boundaries, they are naturally handled in / as environments. But / document classes normally do not provide predefined environments for theorem-like elements because (a) that would make it difficult for authors to exercise the necessary control over the automatic numbering, and (b) the variety of such elements is so wide that it's just not possible for a document class to provide every one that will ever be needed. Instead there is a command newtheorem, similar to newenvironment in effect, that makes it easy for authors to set up the elements required for a particular document.
The newtheorem command has two mandatory arguments; the first one is the environment name that the author would like to use for this element; the second one is the heading text. For example,
\newtheorem{lem}{Lemma}
means that instances in the document of
\begin{lem} Text text ... \end{lem}
will produce

where the heading consists of the specified text `Lemma' and an automatically generated number and punctuation.
If newtheorem* is used instead of newtheorem in the above example, there will not be any automatic numbers generated for any of the lemmas in the document. This form of the command can be useful if you have only one lemma and don't want it to be numbered; more often, though, it is used to produce a special named variant of one of the common theorem types. For example, if you have a lemma whose name should be `Klein's Lemma' instead of `Lemma' + number, then the statement
\newtheorem*{KL}{Klein's Lemma}
would allow you to write
\begin{KL} Text text ... \end{KL}
and get the desired output.