Short notice: if you implementing your custom user registration via email, and you need, for example, to generate username from email, do this in hook_user, not in your custom user_register_form_submit.
Why? because registration first invokes hook_user($op = 'insert'), and then it goes to form_submit. In my case, after doing it right way, correct username, generated from email, not the random one, was sent in registration email.
In my current project, email_registration module was used for implementing registration by email without username. It worked fine untill rpx module was 1.4, but went totally wrong when we updated rpx to 2.1 for sake of social sharing feature. In short, there was approach changed - rpx 1.4 was using own register form, so it's totally overrides default form. (and thanks to that fact, email_registration worked fine). In 2.1m rpx started to use default register form with adding own stuff in hook_form_alter, and overriding default register form_submit with it's own.
So, what we have? On one side, rpx takes care about user registration, on other side, email_registration saves and authenticates user again. And the funny thing, that both sides mixes their parameters - for example, in registration email rpx's username was sent, but in pair email_registration's pass and vice versa.
After all, I had to overwrite email registration to own module, but this time - in the way that both email registration and rpx module not disturbing each other.
And for those, who's interested in in details, take a look at email_registration module - it's pretty straightforward.