1. When is it advised to return errors as values, versus throw ConvexError? 2. Is the article saying it's a matter of preference for the codebase, or that it's situational? 3. I like Effect (TS library) philosophy of forcing you to handle all exceptions with types, but unlike Effect, returning an 'error' value in Convex doesn't automatically log as such so idk if it's really better than throwing