Lets user have full control over how the Observable is created with sane defaults for eager/non-eager cases.