public AutenticacionPorUsuario(IAutenticador autenticador, IFormateadorExcepciones formateadorExcepciones)
        {
            Autenticador = autenticador ?? throw new ArgumentNullException(nameof(autenticador));

            Autenticar = ReactiveCommand.CreateFromTask(AutenticarImpl);

            errores = Autenticar.ThrownExceptions.Select(e =>
            {
                if (formateadorExcepciones.PuedeFormatear(e))
                {
                    return(formateadorExcepciones.Formatear(e));
                }
                else
                {
                    throw new ArgumentException("El formateador no puede formatear la excepción.", e);
                }
            })
                      .ToProperty(this, x => x.Errores);

            tieneErrores = Autenticar
                           .StartWith((Sesion)null)
                           .Timestamp()
                           .CombineLatest(
                Autenticar.ThrownExceptions
                .StartWith((Exception)null)
                .Timestamp(),
                (Sesion, Excepcion) => (Sesion, Excepcion))
                           .Select(v => v.Sesion.Timestamp < v.Excepcion.Timestamp && v.Excepcion.Value != null)
                           .ToProperty(this, x => x.TieneErrores);
        }