Bott and Tu do this completely, in the de Rham theoretic setting of course.
Here's an alternate proof I have used when I teach this material, which I find slightly more clean and direct than using Thom classes in de Rham theory (which require choice of tubular neighborhood theorem, etc) and works over the integers.
Definition: Given a collection $S = \{W_i\}$ of submanifolds of a manifold $X$, define the smooth chain complex transverse to $S$, denoted ${C^S}_*(X)$, by using the subgroups of the singular chain groups in which the basis chains $\Delta^n \to X$ are smooth and transverse to all of the $W_i$.
Lemma: The inclusion ${C^S}_*(X) \to C_*(X)$ is a quasi-isomorophism, for any such collection $S$.
Now if $W \in S$ then "count of intersection with $W$" gives a perfectly well-defined element $\tau_W$ of
${\rm Hom}(C^S_*(X), A)$ and thus by this quasi-isomorphism a well-defined cocycle if the $W$ is proper and has no boundary. It is immediate that this cocycle evaluates on cycles which are represented by closed submanifolds through intersection count.
There are two approaches to show that cup product agrees with intersection on cohomology. Briefly, one is to take $W, V$ over $M$ and consider the special case of $W \times M$ and $M \times V$ over $M \times M$. There some work with the K"unneth theorem
leads to direct analysis in this case. But this case is "universal" - cup products in $M$ are pulled back from ``external'' cup products over $M \times M$. A second proof given in https://arxiv.org/abs/2106.05986 uses a variant of the theory, where one fixes a triangulation or cubulation, and assumes $W, V$ transverse to those. There we explicitly see that these products do not agree at the cochain level (they can't since intersection is commutative, but non-commutativity of cup product is reflected in Steenrod operations), but Friedman, Medina and I show a vector field flow leads to a cobounding of the difference.
Take a look at Exercise 15 in Section 4.1, page 359 of the book you're referring to. This outlines an argument that should be the sort of thing you're looking for. The main step is to deform a given map to be linear in a neighborhood of the preimage of a point, using either simplicial approximation or the argument that proves the cellular approximation theorem. Once this is done, the rest is essentially the Pontryagin-Thom argument (in a very simple setting), plus the fact that $GL(n,\mathbb R)$ has just two path-components.
Best Answer
If you are willing to assume that the embedded surface $S$ is polyhedral, you can prove that it is orientable by an elementary argument similar to the proof of polygonal Jordan Theorem. Of course the proof is translation of a homology/transversality/separation argument.
Fix a direction (nonzero vector) which is not parallel to any of the faces. For every point $p$ in the complement of $S$, consider the ray starting at $p$ and goint to the chosen direction. If this ray does not intersect edges of $S$, count the number of intersection points of the ray and the surface. If this number is even, you say that $p$ is black, otherwise $p$ is white. If the ray intersects an edge of $S$, you paint $p$ the same color as some nearby point whose ray does not intersect edges. It is easy to see that the color does not change along any path in the complement of $S$ (it suffices to consider only polygonal paths avoiding points whose rays contain vertices of $S$).
Now take points $p$ and $q$ near the surface such that the segment $pq$ is parallel to the chosen direction. Then they are of different colors. But if the surface is non-orientable, you can go from $p$ to $q$ along a Mobius strip contained in the surface. This contradicts the above fact about paths in the complement of $S$.