the cotangent space
If the tangent space at a point collects all the directions you could move, the cotangent space collects all the ways of measuring those movements. Think of a hillside: at a point, the steepness is captured not by an arrow but by a 'rate per step' — a machine that, fed any direction you might walk, returns how fast your altitude changes. Such a measuring machine is a covector, and the cotangent space is the set of all of them at that point.
Precisely, the cotangent space T_p* M is the dual of the tangent space: the set of all linear maps from T_p M to the real numbers. Each covector eats a tangent vector and outputs a number. The cleanest example is the differential of a function: for a smooth f, the covector df at p sends a tangent vector v to the directional derivative v(f) — it reads off how fast f changes in the direction v. In a chart, the coordinate differentials dx^1, ..., dx^n form a basis of the cotangent space, dual to the basis d/dx^1, ..., d/dx^n of the tangent space, meaning dx^i(d/dx^j) equals 1 when i = j and 0 otherwise. Fields of covectors are called differential 1-forms, the natural things to integrate along curves.
Keeping vectors and covectors apart is one of the most useful disciplines in geometry. They transform oppositely under a change of coordinates (one with the Jacobian, the other with its inverse), which is why physicists call vectors 'contravariant' and covectors 'covariant'. Without extra structure there is no way to turn a vector into a covector. A Riemannian metric is exactly such structure: it provides a dictionary (raising and lowering indices) that identifies each tangent vector with a covector — but that identification is an added choice, not something built into the bare manifold.
On the plane take the height function f(x, y) = 3x + 2y. Its differential df is the covector 3 dx + 2 dy. Fed the direction v = (1, 0) it returns 3 (the rate of climb walking east); fed v = (0, 1) it returns 2. The covector is the measuring device; the vector is the step you take.
A covector measures vectors; the differential df reads off how fast a function changes in a given direction.
Vectors and covectors are not the same kind of object, even though both have n components. Treating them interchangeably works only after you secretly use a metric to convert one to the other; without a metric the identification simply does not exist.