More refined cursor context analysis

An expression is now better defined in terms of allowed tokens. This
fixes the issues with parsing things like `x := fmt.#`, which is
currently broken (ref #212).