ANCOVA intercepts - does R center data? I have 2 fixed effects and 2 continuous predictors.  Nothing interacts so I believe I want a model of the form:
$$Y_{ij} = \mu + \tau_i + \beta_j + \gamma_1(X_{1ij}-\bar{X_1}) + \gamma_2(X_{1ij}-\bar{X_2}) + \epsilon_{ij} $$
I gather that this would be expressed be something like:
mod = lm(y ~ facA + facB + contX1 + contX2, data = set1)
mod$coefficients
anova(mod)

However, I'm confused on 2 points.  The first is in my case the fitted intercept does not equal the "grand mean" (sample mean) of all Y responses as is typically the case in fixed-effect ANOVA.  Should this be the case?
If I manually center the continuous predictors the intercept still does not the grand mean.  This gives rise to the second point of confusion - does R automatically center the continuous responses?  I can't find info on this in the documentation.
 A: *

*R uses treatment-contrasts per default with the consequence that the intercept corresponds to the mean value of the first group. For it to represent the grand-mean you have to use effects-coding:
options(contrasts=c("contr.sum","contr.poly"))

Note furthermore, that aov expects balanced samples (i.e., equal group-sizes) to give sensible results.

*No, R does not center numerical variables automatically for ANCOVA. You have to do this by hand.

You can also use package afex for running your ANOVAs by using functions aov.car or ez.glm which automatically uses the correct contrasts, handles unbalanced data, and warns in case of non-centered continuous predictors (but also does not center them for you). You only need to set argument factorize=FALSE as the afex ANOVA functions factorize all variables otherwise. But make sure that the factors are really factors then.
afex also has convenience functions to set the right contrasts globally: set_sum_contrasts() or set_effects_coding()
(full disclosure: I am the author of afex)
A: This is to be expected because the default coding scheme for factors in R is dummy codes. You can see this for factor A if you check contrasts(set1$facA). The intercept will only equal the grand mean in this model if the factors are contrast coded and there are equal cell sizes for all factor levels. You can change the contrasts for individual factors using, e.g., contrasts(set1$facA) <- contr.helmert(length(levels(set1$facA))), or you can change the default codes for all factors with options(contrasts=c("contr.helmert","contr.poly")).
