I was a long term ion user and contributed code over several years to the project before switching to xmonad.
As I remember it, with ion you basically created your own layout manually. You'd make horizontal or vertical splits to divide up your workspace and then manually move windows around in to the resulting frames. It worked brilliantly: with a few keystrokes you could get exactly the windows you wanted in the order you wanted.
xmonad manages the layout for you, you don't have to do it manually. This means that when you create a new window xmonad automatically creates a new frame for it. To contrast, ion would add the window as a new tab of the current frame. If you wanted a new frame in ion then you'd have to create it.
The automatic layouts of xmonad are what make it so interesting, but you do need to spend some time getting them set up for the way you work. xmonad is without a doubt the most customisable window manager ever (which is both a blessing and a curse).
xmonad also works much better with other software than ion. This is a reflection of the developers behind each window manager. The ion developer had very strong opinions about everything and told anything he didn't like (like anti-aliased fonts, automake, GNOME, etc.) to f'ck off. The xmonad team are super-friendly and play well with others. xmonad has great GNOME support, for example.
I think I still prefer ion's way of working, but I strongly suspect that it's possible to duplicate it in xmonad, I just haven't done it yet. Maybe now that 0.9 is out I'll review my xmonad configuration.
I've been using awesome for about a year now, and never had it crash. Xmonad, however, while never crashing, would cause my Xorg process to eventually use all available RAM after several days of use without restarting.
Yeah, I have played with Awesome recently and it is not nearly as flaky anymore. I still enjoy xmonad's test suite, however. Software that ships with a test suite tends to be more reliable than software that doesn't have tests.
(Example of software without a test suite: Emacs. No tests anywhere; not for the byte compiler, not for the memory allocator, nowhere. I am amazed it works at all.)